Maison >développement back-end >C++ >Un thread peut-il lire des données périmées à partir d'une variable atomique C 11 ?

Un thread peut-il lire des données périmées à partir d'une variable atomique C 11 ?

DDD
DDDoriginal
2024-12-13 17:53:10304parcourir

Can One Thread Read Stale Data from a C  11 Atomic Variable?

Concurrence : compréhension atomique et volatile dans le modèle de mémoire C 11

Considérez une variable globale accessible par plusieurs threads s'exécutant simultanément sur différents cœurs. Chaque thread peut à la fois écrire et lire dans la variable. Un thread peut-il lire des informations obsolètes à partir d'une variable atomique ?

Volatile et atomique : une distinction

Bien qu'atomique implique un accès atomique, volatile seul ne le fait pas. Volatile est utilisé dans des situations telles que les E/S mappées en mémoire et la gestion des signaux. Il devient redondant lorsqu'il est associé à std::atomic. De plus, cela n'a aucun rapport avec l'accès atomique ou l'ordre de la mémoire inter-thread.

Ordre de la mémoire avec des variables atomiques

La bibliothèque std::atomic en C 11 offre un type entier atomique,

 std::atomique<int> ai; 

Les limitations de visibilité et de séquençage dépendent de l'ordre de mémoire fourni pour les opérations :

  • Ordre cohérent de séquence (std::memory_order_seq_cst) : maintient un ordre total unique pour toutes les opérations à travers toutes les variables. Cela ne garantit pas que les valeurs obsolètes seront absentes, mais cela garantit que la valeur obtenue détermine et est déterminée par la position de l'opération dans la commande.
  • Ordre détendu (std::memory_order_relaxed) : supprime tout ordre. contraintes, permettant une vitesse optimale mais risquant un ordre d'exécution imprévisible.

Lecture-Modification-Écriture Opérations (RMW) : garantir la fraîcheur

Les opérations RMW, comme Exchange(), compare_exchange_strong() et fetch_add(), offrent une garantie : elles agissent toujours sur la valeur la plus récente. Dans une série d'appels à ai.fetch_add(1) à partir de plusieurs threads, aucun numéro en double ou manquant ne sera renvoyé. Cependant, les threads peuvent voir les valeurs à différents moments dans le temps.

Attention et conclusion

Comprendre les opérations atomiques est crucial. Des recherches approfondies et une révision du code sont recommandées avant de les utiliser dans le code de production. Les verrous offrent souvent une approche plus accessible et presque aussi efficace en matière de concurrence.

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