Namespaces
Variants

std:: atomic_ref

From cppreference.net
Concurrency support library
Threads
(C++11)
(C++20)
this_thread namespace
(C++11)
(C++11)
Cooperative cancellation
Mutual exclusion
Generic lock management
Condition variables
(C++11)
Semaphores
Latches and Barriers
(C++20)
(C++20)
Futures
(C++11)
(C++11)
(C++11)
Safe reclamation
Hazard pointers
Atomic types
(C++11)
atomic_ref
(C++20)
Initialization of atomic types
(C++11) (deprecated in C++20)
(C++11) (deprecated in C++20)
Memory ordering
(C++11) (deprecated in C++26)
Free functions for atomic operations
Free functions for atomic flags
Défini dans l'en-tête <atomic>
template < class T >
struct atomic_ref ;
(depuis C++20)

La classe template std::atomic_ref applique des opérations atomiques à l'objet qu'elle référence.

Pour la durée de vie de l'objet std::atomic_ref , l'objet qu'il référence est considéré comme un objet atomique. Si un thread écrit dans un objet atomique tandis qu'un autre thread le lit, le comportement est bien défini (voir le modèle de mémoire pour plus de détails sur les courses de données). De plus, les accès aux objets atomiques peuvent établir une synchronisation inter-threads et ordonner les accès mémoire non atomiques comme spécifié par std::memory_order .

La durée de vie d'un objet doit excéder la durée de vie de toutes les std::atomic_ref qui référencent l'objet. Tant qu'une instance de std::atomic_ref référençant un objet existe, l'objet doit être accédé exclusivement par ces instances de std::atomic_ref . Aucun sous-objet d'un objet référencé par un objet std::atomic_ref ne peut être référencé simultanément par un autre objet std::atomic_ref .

Les opérations atomiques appliquées à un objet via un std::atomic_ref sont atomiques par rapport aux opérations atomiques appliquées via tout autre std::atomic_ref référençant le même objet.

Comme les références dans le langage de base, la constance est superficielle pour std::atomic_ref - il est possible de modifier la valeur référencée à travers un objet const std::atomic_ref .

Si l'une des conditions suivantes est satisfaite, le programme est mal formé :

std::atomic_ref est CopyConstructible .

Table des matières

Types imbriqués

Type Définition
value_type std:: remove_cv_t < T >
difference_type
  • value_type , si T est un type arithmétique autre que cv bool .
  • Sinon, std::ptrdiff_t , si T est un type pointeur-vers-objet.
  • Sinon, non défini.

Membres de données

Membre Description
T * ptr le pointeur vers l'objet référencé
( membre objet d'exposition uniquement* )
indique que le type est toujours sans verrou
(constante membre statique publique)
indique l'alignement requis d'un objet pour être référencé par atomic_ref
(constante membre statique publique)

Fonctions membres

construit un objet atomic_ref
(fonction membre publique)
stocke une valeur dans l'objet référencé par un atomic_ref objet
(fonction membre publique)
vérifie si l'objet atomic_ref est sans verrou
(fonction membre publique)
remplace atomiquement la valeur de l'objet référencé par un argument non atomique
(fonction membre publique)
obtient atomiquement la valeur de l'objet référencé
(fonction membre publique)
charge une valeur depuis l'objet référencé
(fonction membre publique)
remplace atomiquement la valeur de l'objet référencé et obtient la valeur détenue précédemment
(fonction membre publique)
compare atomiquement la valeur de l'objet référencé avec l'argument non atomique et effectue un échange atomique si égal ou un chargement atomique sinon
(fonction membre publique)
bloque le thread jusqu'à notification et changement de la valeur atomique
(fonction membre publique)
notifie au moins un thread en attente sur l'objet atomique
(fonction membre publique)
notifie tous les threads bloqués en attente sur l'objet atomique
(fonction membre publique)
(C++26)
renvoie l'adresse de l'objet
(fonction membre publique)
Fourni uniquement lorsque T est un type arithmétique autre que cv bool ou un type pointeur-sur-objet
ajoute atomiquement l'argument à la valeur stockée dans l'objet référencé et obtient la valeur détenue précédemment
(fonction membre publique)
soustrait atomiquement l'argument de la valeur stockée dans l'objet référencé et obtient la valeur détenue précédemment
(fonction membre publique)
ajoute ou soustrait atomiquement de la valeur référencée
(fonction membre publique)
Fourni uniquement lorsque T est un type intégral autre que cv bool ou un type pointeur-vers-objet
(C++26)
effectue atomiquement std::max entre l'argument et la valeur de l'objet référencé et obtient la valeur détenue précédemment
(fonction membre publique)
(C++26)
effectue atomiquement std::min entre l'argument et la valeur de l'objet référencé et obtient la valeur détenue précédemment
(fonction membre publique)
incrémente ou décrémente atomiquement l'objet référencé de un
(fonction membre publique)
Fourni uniquement lorsque T est un type intégral autre que cv bool
effectue atomiquement un ET binaire entre l'argument et la valeur de l'objet référencé et obtient la valeur détenue précédemment
(fonction membre publique)
effectue atomiquement un OU binaire entre l'argument et la valeur de l'objet référencé et obtient la valeur détenue précédemment
(fonction membre publique)
effectue atomiquement un OU exclusif bit à bit entre l'argument et la valeur de l'objet référencé et obtient la valeur détenue précédemment
(fonction membre publique)
effectue atomiquement un ET, OU, XOR bit à bit avec la valeur référencée
(fonction membre publique)

Spécialisations

La norme spécifie que std::atomic_ref possède les spécialisations suivantes :

template <>
struct atomic_ref < /*integral-type*/ > ;
(1) (depuis C++20)
template <>
struct atomic_ref < /*floating-point-type*/ > ;
(2) (depuis C++20)
template < class /*pointer-type*/ >

requires /* voir ci-dessous */

struct atomic_ref < /*pointer-type*/ > ;
(3) (depuis C++20)
1) /*integral-type*/ désigne un type intégral éventuellement qualifié cv autre que cv bool .
2) /*floating-point-type*/ désigne un type à virgule flottante éventuellement qualifié cv.
3) La spécialisation partielle est fournie pour les types /*pointer-type*/ qui sont des types pointeur-vers-objet potentiellement qualifiés cv.

Notes

Les implémentations peuvent fusionner les spécialisations spécifiées. Par exemple, MSVC STL fusionne toutes celles-ci dans le modèle principal.

Lorsque T est cv void ou un type de fonction, std :: atomic_ref < T * > (c'est-à-dire std :: atomic_ref < void * > , std :: atomic_ref < int ( * ) ( ) > etc.) ne possède pas difference_type ni aucune opération nécessitant de l'arithmétique de pointeur ou de comparaison relationnelle (depuis C++26) .

Macro de test de fonctionnalité Valeur Std Fonctionnalité
__cpp_lib_atomic_ref 201806L (C++20) std::atomic_ref
__cpp_lib_constexpr_atomic 202411L (C++26) constexpr std::atomic et std::atomic_ref

Rapports de défauts

Les rapports de défauts modifiant le comportement suivants ont été appliqués rétroactivement aux normes C++ précédemment publiées.

DR Appliqué à Comportement publié Comportement corrigé
LWG 3508
( P3323R1 )
C++20 atomic_ref < T > avait des opérations non implémentables
si T est un type const ou un type pointeur-vers-non-objet
ces opérations sont soit contraintes
soit non fournies pour les T inappropriés

Voir aussi

(C++11)
Modèle de classe atomic et spécialisations pour les types booléens, entiers, virgule flottante, (depuis C++20) et pointeurs
(modèle de classe)