Maison >développement back-end >C++ >Comment les réorganisations internes dans les opérations de lecture-modification-écriture atomique C affectent-elles l'ordre de la mémoire ?
Traitement des opérations atomiques de lecture-modification-écriture (RMW) dans l'ordre de la mémoire
En réponse à la question concernant la nature de la lecture atomique -opérations de modification-écriture (RMW), le standard C les classe comme des opérations uniques avec une sémantique qui combine à la fois l'acquisition et la libération propriétés.
Implications pour l'ordre
Cette désignation implique qu'aucune lecture ou écriture de mémoire se produisant dans le même thread ne peut être réorganisée avant ou après une opération RMW. Cependant, cela n'exclut pas la possibilité de réorganiser entre les composants internes de lecture et d'écriture du RMW.
Exemple concret
Considérez l'exemple de code fourni :
std::atomic<int> x, y; void thread_A() { x.exchange(1, std::memory_order_acq_rel); y.store(1, std::memory_order_relaxed); } void thread_B() { int yy = y.load(std::memory_order_acquire); int xx = x.load(std::memory_order_acquire); std::cout << xx << ", " << yy << std::endl; }
Dans ce scénario, le thread B peut en effet générer 0, 1. En effet, les opérations de chargement et de stockage effectuées dans le RMW du thread A L'opération peut être réorganisée en interne, permettant au Thread B d'observer l'état après le chargement (0) mais avant le stockage (1).
Implémentation ARM64
L'implémentation ARM64 de l'opération RMW, telle que décrite par les instructions ldaxr, stlxr et str, est conforme aux attentes de la norme. L'instruction str peut être visible avant l'instruction stlxr, conduisant potentiellement à l'observation de 0, 1 par le fil B.
Implications sur l'ordre mémoire
Le remplacement de memory_order_acq_rel par seq_cst serait n'affecte pas ce comportement, car il introduit uniquement une sémantique supplémentaire par rapport aux autres opérations seq_cst, qui ne sont pas présentes dans le code exemple.
Conclusion
Les opérations atomiques RMW en C sont des opérations singulières avec une sémantique d'acquisition-libération. Bien qu'ils empêchent la réorganisation des opérations externes avant et après, le potentiel de réorganisation entre leurs composants internes permet des scénarios comme celui de l'exemple de code, où le thread B peut générer 0, 1.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!