atomic_compare_exchange_weak, atomic_compare_exchange_strong, atomic_compare_exchange_weak_explicit, atomic_compare_exchange_strong_explicit
|
Défini dans l'en-tête
<stdatomic.h>
|
||
|
_Bool atomic_compare_exchange_strong
(
volatile
A
*
obj,
C * expected, C desired ) ; |
(1) | (depuis C11) |
|
_Bool atomic_compare_exchange_weak
(
volatile
A
*
obj,
C * expected, C desired ) ; |
(2) | (depuis C11) |
|
_Bool atomic_compare_exchange_strong_explicit
(
volatile
A
*
obj,
C
*
expected, C desired,
|
(3) | (depuis C11) |
|
_Bool atomic_compare_exchange_weak_explicit
(
volatile
A
*
obj,
C
*
expected, C desired,
|
(4) | (depuis C11) |
Compare atomiquement le contenu de la mémoire pointée par
obj
avec le contenu de la mémoire pointée par
expected
, et s'ils sont égaux bit à bit, remplace le premier par
desired
(effectue une opération de lecture-modification-écriture). Sinon, charge le contenu actuel de la mémoire pointée par
obj
dans
*expected
(effectue une opération de chargement).
Les modèles de mémoire pour les opérations de lecture-modification-écriture et de chargement sont
succ
et
fail
respectivement. Les versions (1-2) utilisent par défaut
memory_order_seq_cst
.
Les formes faibles ((2) et (4)) des fonctions peuvent échouer de manière sporadique, c'est-à-dire agir comme si * obj ! = * expected même s'ils sont égaux. Lorsqu'un compare-and-exchange est dans une boucle, la version faible offrira de meilleures performances sur certaines plateformes. Lorsqu'un compare-and-exchange faible nécessiterait une boucle et qu'un fort ne le nécessiterait pas, le fort est préférable.
Ceci est une
fonction générique
définie pour tous les
types d'objets atomiques
A
. L'argument est un pointeur vers un type atomique volatile pour accepter les adresses des objets atomiques non volatiles et
volatiles
(par exemple les E/S mappées en mémoire), et la sémantique volatile est préservée lors de l'application de cette opération aux objets atomiques volatiles.
C
est le type non atomique correspondant à
A
.
Il n'est pas spécifié si le nom d'une fonction générique est une macro ou un identifiant déclaré avec liaison externe. Si une définition de macro est supprimée pour accéder à une fonction réelle (par exemple, mise entre parenthèses comme ( atomic_compare_exchange ) ( ... ) ), ou si un programme définit un identifiant externe portant le nom d'une fonction générique, le comportement est indéfini.
Table des matières |
Paramètres
| obj | - | pointeur vers l'objet atomique à tester et modifier |
| expected | - | pointeur vers la valeur attendue dans l'objet atomique |
| desired | - | valeur à stocker dans l'objet atomique si elle correspond à celle attendue |
| succ | - | ordonnancement de synchronisation mémoire pour l'opération de lecture-modification-écriture si la comparaison réussit. Toutes les valeurs sont permises. |
| fail | - |
ordonnancement de synchronisation mémoire pour l'opération de chargement si la comparaison échoue. Ne peut pas être
memory_order_release
ou
memory_order_acq_rel
et ne peut pas spécifier un ordonnancement plus strict que
succ
|
Valeur de retour
Le résultat de la comparaison :
true
si
*obj
était égal à
*exp
,
false
sinon.
Notes
Le comportement de la famille
atomic_compare_exchange_*
est comme si ce qui suit était exécuté de manière atomique :
Références
- Norme C17 (ISO/CEI 9899:2018) :
-
- 7.17.7.4 Les fonctions génériques atomic_compare_exchange (p: 207)
- Norme C11 (ISO/CEI 9899:2011) :
-
- 7.17.7.4 Les fonctions génériques atomic_compare_exchange (p: 283-284)
Voir aussi
|
échange une valeur avec la valeur d'un objet atomique
(fonction) |
|
|
Documentation C++
pour
atomic_compare_exchange_weak
,
atomic_compare_exchange_strong
,
atomic_compare_exchange_weak_explicit
,
atomic_compare_exchange_strong_explicit
|
|