<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:pure
de , 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 memcmp
de . 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 Énumération |
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++