<atomic>

Définit des classes et des modèles de classe à utiliser pour créer des types qui prennent en charge les opérations atomiques.

Syntaxe

#include <atomic>

Notes

Remarque

Dans le code compilé à l’aide /clr:purede , cet en-tête est bloqué. Les deux /clr:pure versions et /clr:safe sont déconseillées dans Visual Studio 2017 et versions ultérieures.

Une opération atomique a deux propriétés clés qui vous aident à utiliser plusieurs threads pour manipuler correctement un objet sans utiliser mutex de verrous.

  • Étant donné qu’une opération atomique est asynchrone, une deuxième opération atomique sur le même objet à partir d’un thread différent peut obtenir l’état de l’objet uniquement avant ou après la première opération atomique.

  • En fonction de son memory_order argument, une opération atomique établit des exigences de classement pour la visibilité des effets d’autres opérations atomiques dans le même thread. Par conséquent, elle empêche les optimisations du compilateur qui enfreignent les contraintes d’ordre.

Sur certaines plateformes, il n’est pas possible d’implémenter efficacement des opérations atomiques pour certains types sans utiliser de verrous mutex. Un type atomique est lock-free si aucune opération atomique sur ce type n’utilise des verrous.

C++11: dans les gestionnaires de signal, vous pouvez effectuer des opérations atomiques sur un objet obj si obj.is_lock_free() ou atomic_is_lock_free(x) sont true.

La classe atomic_flag fournit un type atomique minimal qui contient un bool indicateur. Ses opérations sont toujours sans verrou.

Le modèle atomic<T> de classe stocke un objet de son type T d’argument et fournit un accès atomique à cette valeur stockée. Vous pouvez l’instancier à l’aide de n’importe quel type qui peut être copié à l’aide memcpy et testé pour l’égalité à l’aide memcmpde . En particulier, vous pouvez l’utiliser avec les types définis par l’utilisateur qui répondent à ces exigences et, dans de nombreux cas, avec les types à virgule flottante.

Le modèle a également un ensemble de spécialisations pour les types intégraux et une spécialisation partielle pour les pointeurs. Ces spécialisations fournissent des opérations supplémentaires qui ne sont pas disponibles via le modèle principal.

Spécialisations de pointeur

Les spécialisations partielles atomic<T *> s’appliquent à tous les types de pointeur. Elles fournissent des méthodes pour l’arithmétique de pointeur.

Spécialisations intégrales

Les spécialisations atomic<integral> s’appliquent à tous les types intégraux. Ils fournissent des opérations supplémentaires qui ne sont pas disponibles via le modèle principal.

Chaque type atomic<integral> a une macro correspondante que vous pouvez utiliser dans un if directive pour déterminer au moment de la compilation si les opérations sur ce type sont sans verrou. Si la valeur de la macro est égale à zéro, les opérations sur le type ne sont pas sans verrou. Si la valeur est 1, les opérations peuvent être sans verrou et une vérification au moment de l’exécution est nécessaire. Si la valeur est 2, les opérations sont sans verrou. Vous pouvez utiliser la fonction atomic_is_lock_free pour déterminer au moment de l’exécution si les opérations sur le type sont sans verrou.

Pour chacun des types intégraux, il existe un type atomique nommé correspondant qui gère un objet de ce type intégral. Chaque type atomic_integral a le même ensemble de fonctions membres que l’instanciation correspondante de atomic<T> et peut être passée à toute fonction atomique non-membre.

Type atomic_integral Type intégral Macro atomic_is_lock_free
atomic_char char ATOMIC_CHAR_LOCK_FREE
atomic_schar signed char ATOMIC_CHAR_LOCK_FREE
atomic_uchar unsigned char ATOMIC_CHAR_LOCK_FREE
atomic_char16_t char16_t ATOMIC_CHAR16_T_LOCK_FREE
atomic_char32_t char32_t ATOMIC_CHAR32_T_LOCK_FREE
atomic_wchar_t wchar_t ATOMIC_WCHAR_T_LOCK_FREE
atomic_short short ATOMIC_SHORT_LOCK_FREE
atomic_ushort unsigned short ATOMIC_SHORT_LOCK_FREE
atomic_int int ATOMIC_INT_LOCK_FREE
atomic_uint unsigned int ATOMIC_INT_LOCK_FREE
atomic_long long ATOMIC_LONG_LOCK_FREE
atomic_ulong unsigned long ATOMIC_LONG_LOCK_FREE
atomic_llong long long ATOMIC_LLONG_LOCK_FREE
atomic_ullong unsigned long long ATOMIC_LLONG_LOCK_FREE

Typedef les noms existent pour les spécialisations du modèle atomique pour certains des types définis dans l’en-tête <inttypes.h>.

Type atomique Typedef Name
atomic_int8_t atomic<int8_t>
atomic_uint8_t atomic<uint8_t>
atomic_int16_t atomic<int16_t>
atomic_uint16_t atomic<uint16_t>
atomic_int32_t atomic<int32_t>
atomic_uint32_t atomic<uint32_t>
atomic_int64_t atomic<int64_t>
atomic_uint64_t atomic<uint64_t>
atomic_int_least8_t atomic<int_least8_t>
atomic_uint_least8_t atomic<uint_least8_t>
atomic_int_least16_t atomic<int_least16_t>
atomic_uint_least16_t atomic<uint_least16_t>
atomic_int_least32_t atomic<int_least32_t>
atomic_uint_least32_t atomic<uint_least32_t>
atomic_int_least64_t atomic<int_least64_t>
atomic_uint_least64_t atomic<uint_least64_t>
atomic_int_fast8_t atomic<int_fast8_t>
atomic_uint_fast8_t atomic<uint_fast8_t>
atomic_int_fast16_t atomic<int_fast16_t>
atomic_uint_fast16_ atomic<uint_fast16_t>
atomic_int_fast32_t atomic<int_fast32_t>
atomic_uint_fast32_t atomic<uint_fast32_t>
atomic_int_fast64_t atomic<int_fast64_t>
atomic_uint_fast64_t atomic<uint_fast64_t>
atomic_intptr_t atomic<intptr_t>
atomic_uintptr_t atomic<uintptr_t>
atomic_size_t atomic<size_t>
atomic_ptrdiff_t atomic<ptrdiff_t>
atomic_intmax_t atomic<intmax_t>
atomic_uintmax_t atomic<uintmax_t>

Structures

Nom Description
atomic Structure Décrit un objet qui effectue des atomic opérations sur une valeur stockée.
atomic_flag Structure Décrit un objet qui définit et efface atomiquement un indicateur bool.

Énumérations

Nom Description
memory_order Enum Fournit les noms symboliques des opérations de synchronisation sur les emplacements de mémoire. Ces opérations affectent l’affichage des assignations d’un thread dans un autre thread.

Functions

Dans la liste suivante, les fonctions qui ne se terminent _explicit pas ont la sémantique des éléments correspondants _explicit, sauf qu’elles ont les arguments implicites memory_order de memory_order_seq_cst.

Nom Description
atomic_compare_exchange_strong Effectue une atomic compare and exchange opération.
atomic_compare_exchange_strong_explicit Effectue une atomic compare and exchange opération.
atomic_compare_exchange_weak Effectue une weak atomic compare and exchange opération.
atomic_compare_exchange_weak_explicit Effectue une weak atomic compare and exchange opération.
atomic_exchange Remplace une valeur stockée.
atomic_exchange_explicit Remplace une valeur stockée.
atomic_fetch_add Ajoute une valeur spécifiée à la valeur stockée existante.
atomic_fetch_add_explicit Ajoute une valeur spécifiée à la valeur stockée existante.
atomic_fetch_and Effectue un « and » au niveau du bit (&) sur une valeur spécifiée et une valeur stockée existante.
atomic_fetch_and_explicit Effectue un « and » au niveau du bit (&) sur une valeur spécifiée et une valeur stockée existante.
atomic_fetch_or Effectue un « ou » au niveau du bit (|) sur une valeur spécifiée et une valeur stockée existante.
atomic_fetch_or_explicit Effectue un « ou » au niveau du bit (|) sur une valeur spécifiée et une valeur stockée existante.
atomic_fetch_sub Soustrait une valeur spécifiée de la valeur stockée existante.
atomic_fetch_sub_explicit Soustrait une valeur spécifiée de la valeur stockée existante.
atomic_fetch_xor Effectue une opération « exclusive » au niveau du bit (^) sur une valeur spécifiée et une valeur stockée existante.
atomic_fetch_xor_explicit Effectue une opération « exclusive » au niveau du bit (^) sur une valeur spécifiée et une valeur stockée existante.
atomic_flag_clear Définit l’indicateur dans un objet atomic_flag avec la valeur false.
atomic_flag_clear_explicit Définit l’indicateur dans un objet atomic_flag avec la valeur false.
atomic_flag_test_and_set Définit l’indicateur dans un objet atomic_flag avec la valeur true.
atomic_flag_test_and_set_explicit Définit l’indicateur dans un objet atomic_flag avec la valeur true.
atomic_init Définit la valeur stockée dans un objet atomic.
atomic_is_lock_free Spécifie si les opérations atomiques sur un objet spécifié sont sans verrou.
atomic_load Récupère une valeur de manière atomique.
atomic_load_explicit Récupère une valeur de manière atomique.
atomic_signal_fence Agit comme un fence élément qui établit les exigences de classement de la mémoire entre les clôtures dans un thread appelant qui a des gestionnaires de signal exécutés dans le même thread.
atomic_store Stocke une valeur de manière atomique.
atomic_store_explicit Stocke une valeur de manière atomique.
atomic_thread_fence Agit comme un fence élément qui établit des exigences de classement de la mémoire par rapport à d’autres clôtures.
kill_dependency Arrête une chaîne de dépendance possible.

Voir aussi

Informations de référence sur les fichiers d’en-tête
Informations de référence sur la bibliothèque standard C++