Maison >développement back-end >C++ >Une lecture-modification-écriture atomique est-elle une opération singulière ou une séquence d'opérations d'acquisition-libération ?

Une lecture-modification-écriture atomique est-elle une opération singulière ou une séquence d'opérations d'acquisition-libération ?

Mary-Kate Olsen
Mary-Kate Olsenoriginal
2024-12-01 14:06:13798parcourir

Is an Atomic Read-Modify-Write a Singular Operation or a Sequence of Acquire-Release Operations?

Distinction entre les opérations singulières et séparées en lecture-modification-écriture atomique

Dans le contexte de l'ordre de la mémoire, le comportement de la lecture-modification-écriture atomique (RMW) les opérations, telles que x.exchange(...) avec std::memory_order_acq_rel, posent une question : cette opération est-elle traitée comme une entité unique avec une sémantique d'acquisition-libération ou comme une séquence d'opérations comprenant une charge d'acquisition suivie d'un magasin de libération ?

Perspective standard : opération singulière

Selon le standard C, une opération RMW est considérée comme une opération singulière. Cette implication découle de son nom, qui utilise le singulier, et du libellé associé de la norme. Par conséquent, dans ce contexte, l'opération x.exchange(...) est considérée comme une entité unique.

Implications sur l'ordre : réorganisation potentielle

Si l'on considère le Du point de vue du standard, le code fourni a le potentiel de générer 0, 1. Cette possibilité survient parce que le standard n'est pas défini en termes de réorganisation des opérations mais plutôt en termes de relation de synchronisation entre la version et Opérations d'acquisition.

Plus précisément, l'opération y.load(acquire) n'a pas de magasin de version ou plus fort correspondant. Par conséquent, il ne se synchronise avec aucune autre opération et est effectivement traité comme une charge relâchée (y.load(relaxed)).

De plus, le composant "acquire" de l'opération x.exchange(1, acq_rel) ne ne pas avoir de magasins avec lesquels se synchroniser, ce qui rend sa sémantique d'acquisition efficacement détendue. Cela le transforme effectivement en une opération x.store(1, release).

Comme il n'y a aucune opération avant le magasin et après le chargement sur x dans les threads respectifs, la synchronisation potentielle entre ces opérations devient redondante. Par conséquent, les deux charges peuvent renvoyer 0 ou 1, permettant la sortie 0, 1.

Conclusion

Du point de vue du standard C, une lecture atomique L’opération de modification-écriture est considérée comme une opération unique. Cette compréhension implique que, dans l'exemple fourni, le code a le potentiel d'imprimer 0, 1 en raison du manque de synchronisation entre les charges et les magasins.

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