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