Lorsque plusieurs threads accèdent simultanément à une variable globale partagée, les threads peuvent écrire et lire à partir de la variable avec différentes copies mises en cache dans différents cœurs de processeur. Il est possible qu'un thread lise une valeur obsolète dans son cache en raison de la divergence potentielle entre les valeurs stockées dans les différents caches.
Cependant, la norme C 11 fournit la bibliothèque std::atomic pour les opérations atomiques. , garantissant que la dernière valeur est lue depuis l'autre cache. Ceci est obtenu grâce à un ordre de mémoire fort, qui garantit que les modifications apportées par un thread sont visibles par les autres threads dans un ordre cohérent.
D'un autre côté, le mot-clé volatile indique simplement qu'une variable ne doit pas être optimisée par le compilateur, mais il ne fournit aucune garantie d'accès atomique. Il est conçu principalement pour des scénarios tels que les E/S mappées en mémoire ou la gestion des signaux.
Dans le contexte de variables partagées entre les threads, telles que les suivantes :
std::atomicai;
Le comportement des types volatils et atomiques sera considérablement différent. volatile ne garantit pas l'accès atomique et son utilisation en combinaison avec std::atomic est redondante. Si la plate-forme matérielle spécifie le contraire, volatile peut n'avoir aucune incidence sur l'accès atomique ou l'ordre de la mémoire entre les threads.
D'un autre côté, le type std::atomic fournit l'ordre de la mémoire via diverses options telles que std::memory_order_seq_cst , qui applique un ordre total unique pour toutes les opérations atomiques sur toutes les variables. Cela garantit que les contraintes de visibilité et d'ordre sont maintenues et que les threads n'observeront pas les valeurs obsolètes dans un ordre strictement défini.
De plus, en utilisant des opérations de lecture-modification-écriture comme Exchange(), compare_exchange_strong() et fetch_add () garantit l’accès à la dernière valeur. En exécutant ces opérations dans le même contexte de thread, les threads observeront les valeurs mises à jour dans le bon ordre, évitant ainsi les incohérences.
Travailler avec des opérations atomiques nécessite un examen et une compréhension minutieux. Il est conseillé de rechercher minutieusement les documents de base et le code existant pour implémenter efficacement les opérations atomiques dans le code de production. Dans de nombreux cas, les verrous peuvent constituer une alternative viable lorsque les défis des opérations atomiques ne sont pas nécessaires.
Clause de non-responsabilité: Toutes les ressources fournies proviennent en partie d'Internet. En cas de violation de vos droits d'auteur ou d'autres droits et intérêts, veuillez expliquer les raisons détaillées et fournir une preuve du droit d'auteur ou des droits et intérêts, puis l'envoyer à l'adresse e-mail : [email protected]. Nous nous en occuperons pour vous dans les plus brefs délais.
Copyright© 2022 湘ICP备2022001581号-3