http://gcc.gnu.org/onlinedocs/gcc-4.4.2/gcc/Atomic-Builtins.html
Je pense que le code suivant augmente la valeur de var de façon atomique.
volatile int var = 0;
__sync_fetch_and_add( &var, 1 )
J'ai compris que les codes ci-dessus étaient les suivants logique :
- Charger l'adresse de la variable var
- écrire le numéro 1 sur la variable var atomiquement - à travers le registre/cache, en quelque sorte
Cependant, je doute que ce qui suit soit aussi atomique
volatile int var = 0;
volatile int num = 1;
__sync_fetch_and_add( &var, num )
Puisqu'il peut être interprété comme
- Charger l'adresse de la variable var
- Charger la valeur de la variable num dans un registre
- écrire la valeur sur la variable var.
Après l'exécution du n°2, mais avant le n°3, le CPU/thread est interrompu et un autre CPU/thread met à jour la valeur de la variable num.
En d'autres termes, lorsque vous utilisez _ sync *() de gcc, puis-je utiliser une variable, et non une constante, comme second argument ?
Cela ne rompt-il pas l'atomicité ?