std:: atomic_ref
|
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:: is_trivially_copyable_v < T > est false .
-
is_always_lock_freeest false et std:: is_volatile_v < T > est true .
std::atomic_ref
est
CopyConstructible
.
Table des matières |
Types imbriqués
| Type | Définition |
value_type
|
std:: remove_cv_t < T > |
difference_type
|
|
Membres de données
| Membre | Description |
T
*
ptr
|
le pointeur vers l'objet référencé
( membre objet d'exposition uniquement* ) |
|
[static]
|
indique que le type est toujours sans verrou
(constante membre statique publique) |
|
[static]
|
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
|
|
|
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
|
|
|
(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
|
|
|
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 */
|
(3) | (depuis C++20) |
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) |