Le GCC Wiki dit ceci à propos du mode de synchronisation du modèle de mémoire Acquérir/Libérer :
Pour rendre les choses un peu plus complexes, les interactions des variables non atomiques sont toujours les mêmes. Tout stockage avant une opération atomique doit être vu dans les autres threads qui se synchronisent. Par exemple :
-Thread 1- y = 20; x.store (10, memory\_order\_release); -Thread 2- if (x.load(memory\_order\_acquire) == 10) assert (y == 20);Comme 'y' n'est pas une variable atomique, le stockage dans 'y' _se passe avant_ le magasin à 'x', donc l'assert ne peut pas échouer dans ce cas. Les optimiseurs doivent encore limiter les opérations effectuées sur les variables de mémoire partagée autour d'opérations atomiques.
Maintenant, que se passe-t-il si je fais de 'y' une variable atomique (sans imposer se passe avant restrictions) ?
-Thread 1-
y.store (20, memory_order_relaxed);
x.store (10, memory_order_release);
-Thread 2-
if (x.load(memory_order_acquire) == 10)
assert (y.load (memory_order_relaxed) == 20);
L'affirmation peut-elle échouer ? Y a-t-il moins d'exigences pour les variables atomiques que pour les variables non-atomiques ? Ou est-ce que la restriction du Wiki aux variables non-atomiques est gratuite et trompeuse ici ?