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;
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!