атомарный обмен с 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