Maison > développement back-end > C++ > Les opérations de lecture-modification-écriture atomiques C sont-elles des opérations uniques avec une sémantique d'acquisition-libération, ou une séquence de chargements et de magasins ?

Les opérations de lecture-modification-écriture atomiques C sont-elles des opérations uniques avec une sémantique d'acquisition-libération, ou une séquence de chargements et de magasins ?

Barbara Streisand
Libérer: 2024-12-07 19:22:13
original
314 Les gens l'ont consulté

Are C   Atomic Read-Modify-Write Operations Single Operations with Acquire-Release Semantics, or a Sequence of Loads and Stores?

Ordre de la mémoire avec les opérations atomiques de lecture-modification-écriture

En C, les opérations atomiques de lecture-modification-écriture (RMW) telles que x .exchange() applique des garanties de commande spécifiques par rapport aux autres charges et magasins. La question se pose de savoir si ces opérations sont prises en compte :

  1. Une opération unique avec une sémantique d'acquisition-libération
  2. Une charge d'acquisition suivie d'un magasin de libération avec des garanties supplémentaires

Perspective standard

Selon la norme C, les opérations RMW sont traitées comme des opérations uniques. Ceci est implicite par leur nom singulier et la formulation associée.

Implémentation ARM64

Dans ARM64, les opérations RMW sont implémentées sous la forme d'une séquence d'instructions de chargement, d'échange atomique et de stockage. . Bien que théoriquement cette implémentation permette à l'instruction de magasin de devenir visible avant l'échange atomique, cela n'affecte pas les garanties d'ordre de mémoire de la norme.

Synchronisation de la mémoire

Synchronisation de la mémoire en C est principalement basé sur la relation de synchronisation entre les opérations de libération et d'acquisition. Dans l'exemple de code fourni :

  • x.exchange(1, std::memory_order_acq_rel) : L'acquisition de la relation de synchronisation avec n'a pas d'importance car il n'y a pas de magasins ultérieurs à x.
  • x.load(std::memory_order_acquire) : La charge sur x ne se synchronise avec rien, ce qui la rend efficace détendu.

Analyse de synchronisation

Comme il n'y a pas d'autres opérations avec lesquelles se synchroniser, la séquence suivante se produit :

  1. Store à y
  2. Charger sur y (détendu)
  3. Charger sur x (détendu)

Sortie possible

Par conséquent, le code peut en effet sortir 0, 1. La perspective de la norme implique que l'opération RMW est une opération unique avec aucune garantie supplémentaire, permettant cette sortie.

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!

source:php.cn
Déclaration de ce site Web
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
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal