intercambio atómico con CAS (usando gcc sync builtins)

¿Se puede usar la función de comparar y cambiar para intercambiar variables atómicamente? Estoy usando C / C ++ a través de gcc en x86_64 RedHat Linux, específicamente los __sync incorporados. Ejemplo:

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

Creo que esto se reduce a si x puede cambiar entre & x y x; por ejemplo, si & x constituye una operación, es posible que x cambie entre & x y x en los argumentos. Quiero asumir que la comparación implícita arriba siempre será verdadera; Mi pregunta es si puedo. Obviamente está la versión bool de CAS, pero no puedo hacer que la vieja x escriba en y.

Un ejemplo más útil podría ser insertar o eliminar del encabezado de una lista vinculada (gcc afirma que admite tipos de puntero, así que suponga que eso es lo que son elem y 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?

Referencia:http://gcc.gnu.org/onlinedocs/gcc/Atomic-Builtins.html

Respuestas a la pregunta(3)

Su respuesta a la pregunta