Dans la documentation de std::memory_order
sur cppreference.com, il y a un exemple de commande détendue:
Commande détendue
Les opérations atomiques marquées
memory_order_relaxed
ne sont pas des opérations de synchronisation; ils n'imposent pas d'ordre entre les accès simultanés à la mémoire. Ils garantissent uniquement la cohérence de l'ordre d'atomicité et de modification.Par exemple, avec x et y initialement zéro,
// Thread 1: r1 = y.load(std::memory_order_relaxed); // A x.store(r1, std::memory_order_relaxed); // B // Thread 2: r2 = x.load(std::memory_order_relaxed); // C y.store(42, std::memory_order_relaxed); // D
est autorisé à produire r1 == r2 == 42 car, bien que A soit séquencé avant B dans le thread 1 et que C soit séquencé avant D dans le thread 2, rien n'empêche D d'apparaître avant A dans l'ordre de modification de y, et B de apparaissant avant C dans l'ordre de modification de x. L'effet secondaire de D sur y pourrait être visible pour la charge A dans le fil 1 tandis que l'effet secondaire de B sur x pourrait être visible pour la charge C dans le fil 2. En particulier, cela peut se produire si D est terminé avant C dans thread 2, soit en raison de la réorganisation du compilateur, soit au moment de l'exécution.
il dit "C est séquencé avant D dans le thread 2".
Selon la définition de séquencé avant, qui peut être trouvée dans l' ordre d'évaluation , si A est séquencé avant B, alors l'évaluation de A sera terminée avant que l'évaluation de B ne commence. Puisque C est séquencé avant D dans le thread 2, C doit être terminé avant le début de D, par conséquent la partie condition de la dernière phrase de l'instantané ne sera jamais satisfaite.