атомарный обмен с CAS (используя встроенные функции gcc sync)

Можно ли использовать функцию сравнения и обмена для атомного обмена переменных? Я использую C / C ++ через gcc на x86_64 RedHat Linux, в частности, встроенные функции __sync. Пример:

   int x = 0, y = 1; 
   y = __sync_val_compare_and_swap(&x, x, y);

Я думаю, что это сводится к тому, может ли x меняться между & x и x; например, если & x представляет собой операцию, возможно, что x изменится между & x и x в аргументах. Я хочу предположить, что приведенное выше сравнение всегда будет верным; мой вопрос, могу ли я. Очевидно, есть булевая версия CAS, но тогда я не могу заставить старый x записать в y.

Более полезным примером может быть вставка или удаление из заголовка связанного списка (gcc утверждает, что поддерживает типы указателей, поэтому предположим, что это элементы elem и head):

   elem->next = __sync_val_compare_and_swap(&head, head, elem); //always inserts?
   elem = __sync_val_compare_and_swap(&head, head, elem->next); //always removes?

Ссылка:http://gcc.gnu.org/onlinedocs/gcc/Atomic-Builtins.html

Ответы на вопрос(3)

Ваш ответ на вопрос