Maison  >  Article  >  développement back-end  >  Qu'est-ce qu'un objet atomique dans std::atomic<> ?

Qu'est-ce qu'un objet atomique dans std::atomic<> ?

Linda Hamilton
Linda Hamiltonoriginal
2024-11-10 16:33:02510parcourir

What is an Atomic Object in  std::atomic<> ? 
? " />

Qu'est-ce qu'un objet atomique dans std::atomic<>?

Le modèle std::atomic<> fournit un type qui peut être simultanément opéré par plusieurs threads sans déclencher de comportement indéfini.

Atomicité de std::atomic<>

Chaque instanciation de std::atomic<> représente un type atomique qui permet des opérations simultanées par différents threads sur ses instances. Contrairement aux objets C classiques, les objets atomiques garantissent. accès exclusif à leurs données, évitant ainsi les courses aux données.

Atomic Opérations

Les opérations effectuées sur des objets atomiques sont de nature atomique. Cela signifie que :

  • Les modifications apportées à l'état d'un objet atomique sont garanties d'être visibles par tous les threads.
  • Les accès aux objets atomiques peuvent établir une synchronisation inter-thread et ordonner la mémoire non atomique accès.

Ordre de la mémoire et std::atomic<>

std::atomic<> fournit un contrôle précis sur la synchronisation et l'ordre de la mémoire. prend en charge diverses options d'ordre de mémoire, y compris :

  • std::memory_order_relaxed : aucune garantie de synchronisation ou de commande.
  • std::memory_order_release : garantit que les écritures sont visibles par les autres threads acquérant la même variable atomique.
  • std::memory_order_acquire : garantit que les charges sont visibles après une opération de libération sur le même variable atomique dans d'autres threads.
  • std::memory_order_seq_cst : fournit une cohérence séquentielle (ordre global total) entre toutes les opérations atomiques.

Exemple : opérations arithmétiques

Alors que les opérateurs arithmétiques individuels comme = et sont atomiques opérations, leur décomposition en opérations distinctes de chargement, d’ajout et de stockage ne peut pas être atomique. Par exemple :

a = a + 12;

Cette opération impliquera les étapes suivantes :

  1. Charger la valeur de a.
  2. Ajoutez-y 12.
  3. Stockez le résultat dans a.

Les étapes 2 et 3 ne sont pas atomiques, donc là est une condition de concurrence potentielle dans laquelle un autre thread pourrait modifier a entre l'ajout et le magasin.

Alternatives aux opérations arithmétiques de base

Pour les cas d'utilisation typiques impliquant des opérations arithmétiques, il s'agit Il est recommandé d'utiliser les opérateurs surchargés équivalents définis dans std::atomic<>. Ces opérateurs effectuent l'intégralité de l'opération de manière atomique, garantissant une cohérence séquentielle.

Ressources supplémentaires sur l'atomicité et le modèle de mémoire

  • C atomique et ordre de la mémoire
  • Comparaison : programmation sans verrouillage avec des atomes en C 11 vs mutex et RW-locks
  • C 11 a introduit un modèle de mémoire standardisé. Qu'est-ce que ça veut dire? Et comment cela va-t-il affecter la programmation C ?
  • Concurrence en C 11

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