Namespaces
Variants

atomic_compare_exchange_weak, atomic_compare_exchange_strong, atomic_compare_exchange_weak_explicit, atomic_compare_exchange_strong_explicit

From cppreference.net
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,
memory_order succ,

memory_order fail ) ;
(3) (depuis C11)
_Bool atomic_compare_exchange_weak_explicit ( volatile A * obj,

C * expected, C desired,
memory_order succ,

memory_order fail ) ;
(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 :

if (memcmp(obj, expected, sizeof *obj) == 0) {
    memcpy(obj, &desired, sizeof *obj);
    return true;
} else {
    memcpy(expected, obj, sizeof *obj);
    return false;
}

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