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 ?

Comment les réorganisations internes dans les opérations de lecture-modification-écriture atomique C affectent-elles l'ordre de la mémoire ?

Barbara Streisand
Barbara Streisandoriginal
2024-12-09 19:59:12479parcourir

How Do Internal Reorderings in C   Atomic Read-Modify-Write Operations Affect Memory Ordering?

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!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn