gcc atomique fonctions intégrées

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

Je crois que le code suivant augmente la valeur de var atomiquement.

volatile int var = 0;
__sync_fetch_and_add( &var, 1 )

J'ai compris les codes ci-dessus comme suit logique:

  1. Charge l'adresse de la variable var
  2. écrire le numéro 1 sur la variable var, atomiquement grâce à registre/mémoire cache, en quelque sorte

Cependant, je doute que si la suite est atomique, trop

volatile int var = 0;
volatile int num = 1;
__sync_fetch_and_add( &var, num )

Car il peut être interprété comme

  1. Charge l'adresse de la variable var
  2. Charge la valeur de la variable num dans un registre
  3. écrire la valeur dans la variable var.

Après #2 est exécuté, mais avant #3,
le CPU/thread est interrompu et un autre CPU/thread mises à jour
la valeur de la variable num.

En d'autres termes,
lors de l'utilisation d' _sync*() de la gcc,
puis-je utiliser une variable, pas une constante, comme le deuxième argument?

N'est-ce pas briser l'atomicité?

OriginalL'auteur ddoman | 2011-07-22