Maison >développement back-end >C++ >La lecture-modification-écriture atomique est-elle une opération unique ou deux en C ?

La lecture-modification-écriture atomique est-elle une opération unique ou deux en C ?

Patricia Arquette
Patricia Arquetteoriginal
2024-12-05 02:13:09496parcourir

Is Atomic Read-Modify-Write a Single Operation or Two in C  ?

Lecture-Modification-Écriture atomique : une seule opération ou deux ?

À des fins de synchronisation, lecture-modification-écriture atomique (RMW) des opérations comme x.exchange(..., std::memory_order_acq_rel) soulèvent des questions quant à leur traitement. Sont-elles considérées comme une seule opération ou deux opérations distinctes ?

Point de vue du standard

Le standard C considère les opérations RMW comme entités singulières. Cela ressort clairement de leur dénomination et est implicite dans divers langages connexes.

Implications de la synchronisation

Dans votre exemple :

x.exchange(1, std::memory_order_acq_rel); // Line A
y.store(1, std::memory_order_relaxed); // Line B
  • Ligne B n'a pas de version correspondante ni de magasin plus puissant, ce qui en fait effectivement y.store(1, std::memory_order_relaxed).
  • La ligne A n'a qu'une charge correspondante, ce qui rend sa partie "acquérir" redondante. Il peut être visualisé sous la forme x.store(1, std::memory_order_release).

Par conséquent, le code est réduit à :

x.store(1, std::memory_order_release);
y.store(1, std::memory_order_relaxed);

Puisqu'il n'y a aucune opération entre ces stocke et les charges correspondantes dans l’autre thread, la synchronisation est effectivement désactivée. Cela permet la possibilité d'imprimer 0, 1.

Implémentation et implication d'ARM64

L'implémentation de x.exchange() par ARM64 soulève des inquiétudes. Cependant, après un examen plus approfondi, il est évident que la mise en œuvre s'aligne sur la perspective de la norme sur une opération RMW unique. La séquence de commande garantit que la dernière valeur lue dans le RMW est cohérente avec l'écriture.

Citation cppreference incorrecte

Le texte cité de cppreference est inexact. Les opérations RMW en C sont traitées comme des opérations uniques et la réorganisation d'autres opérations avant ou après elles est interdite.

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