atomique swap avec SAE (avec gcc synchroniser les builtins)

Pouvez le compare-and-swap fonction être utilisé pour échanger des variables atomiquement?
Je suis à l'aide de C/C++ via gcc sur x86_64 RedHat Linux, plus précisément l' __synchroniser les builtins.
Exemple:

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

Je pense que cela se résume à savoir si x peut changer entre &x et x; par exemple, si &x constitue une opération, il pourrait être possible pour x pour changer entre &x et x dans les arguments. Je veux supposer que la comparaison implicite ci-dessus sera toujours vrai; ma question est de savoir si je peux. Évidemment il y a le bool version de CAS, mais je ne peux pas obtenir le vieux x pour écrire dans y.

Un exemple plus utile peut-être d'insérer ou de retirer de la tête d'une liste chaînée (gcc demandes de soutien de type pointeur, donc suppose que c'est ce que l'elem et la tête sont):

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

De référence:
http://gcc.gnu.org/onlinedocs/gcc/Atomic-Builtins.html

OriginalL'auteur limalave | 2010-06-04