Namespaces
Variants

Standard library header <atomic> (C++11)

From cppreference.net
Standard library headers

Cet en-tête fait partie de la bibliothèque de prise en charge de la concurrence .

**Note:** Aucune traduction n'a été effectuée car : - Le texte `atomic_uchar` est un terme spécifique C++ (non traduisible) - Le texte `(C++11)` est une référence de version (non traduisible) - Le contenu dans les balises ` ` contient du code C++ (non traduisible) - Le texte `(typedef)` est un terme technique de programmation (non traduisible) Tous les termes techniques C++ et le code ont été préservés conformément aux instructions. **Note:** Aucune traduction n'a été effectuée car : - Tous les termes (`atomic_int_least16_t`, `std::atomic`, `std::int_least16_t`) sont des termes spécifiques au C++ qui ne doivent pas être traduits - Le texte `(C++11)` et `(typedef)` sont des indications techniques qui restent en anglais - Le contenu est principalement constitué de balises HTML et de code C++ **Note:** Aucune traduction n'a été effectuée car : - Tous les termes (`atomic_int_fast64_t`, `std::atomic`, `std::int_fast64_t`) sont des termes spécifiques au C++ qui ne doivent pas être traduits - Le texte `(C++11)` et `(typedef)` sont des annotations techniques qui restent en anglais dans la documentation technique - Le reste du contenu consiste uniquement en des balises HTML et du code C++

Table des matières

Classes

(C++11)
modèle de classe atomic et spécialisations pour bool, types entiers, types à virgule flottante, (depuis C++20) et types pointeurs
(modèle de classe)
(C++20)
fournit des opérations atomiques sur des objets non atomiques
(modèle de classe)
le type atomique booléen sans verrouillage
(classe)
définit les contraintes d'ordonnancement de la mémoire pour l'opération atomique donnée
(enum)
std:: atomic < bool >
(typedef)
std:: atomic < char >
(typedef)
std:: atomic < signed char >
(typedef)
std:: atomic < unsigned char >
(typedef)
std:: atomic < short >
(typedef)
std:: atomic < unsigned short >
(typedef)
(C++11)
std:: atomic < int >
(typedef)
std:: atomic < unsigned int >
(typedef)
std:: atomic < long >
(typedef)
std:: atomic < unsigned long >
(typedef)
std:: atomic < long long >
(typedef)
std:: atomic < unsigned long long >
(typedef)
std:: atomic < char8_t >
(typedef)
std:: atomic < char16_t >
(typedef)
std:: atomic < char32_t >
(typedef)
std:: atomic < wchar_t >
(typedef)
(C++11) (optionnel)
std:: atomic < std:: int8_t >
(typedef)
(C++11) (optionnel)
std:: atomic < std:: uint8_t >
(typedef)
(C++11) (optionnel)
std:: atomic < std:: int16_t >
(typedef)
(C++11) (optionnel)
std:: atomic < std:: uint16_t >
(typedef)
(C++11) (optionnel)
std:: atomic < std:: int32_t >
(typedef)
(C++11) (optionnel)
std:: atomic < std:: uint32_t >
(typedef)
(C++11) (optionnel)
std:: atomic < std:: int64_t >
(typedef)
(C++11) (optionnel)
std:: atomic < std:: uint64_t >
(typedef)
std:: atomic < std:: int_least8_t >
(typedef)
std:: atomic < std:: uint_least8_t >
(typedef)
std:: atomic < std:: int_least16_t >
(typedef)
std:: atomic < std:: uint_least16_t >
(typedef)
std:: atomic < std:: int_least32_t >
(typedef)
std:: atomic < std:: uint_least32_t >
(typedef)
std:: atomic < std:: int_least64_t >
(typedef)
std:: atomic < std:: uint_least64_t >
(typedef)
std:: atomic < std:: int_fast8_t >
(typedef)
std:: atomic < std:: uint_fast8_t >
(typedef)
std:: atomic < std:: int_fast16_t >
(typedef)
std:: atomic < std:: uint_fast16_t >
(typedef)
std:: atomic < std:: int_fast32_t >
(typedef)
std:: atomic < std:: uint_fast32_t >
(typedef)
std:: atomic < std:: int_fast64_t >
(typedef)
std:: atomic < std:: uint_fast64_t >
(typedef)
(C++11) (optionnel)
std:: atomic < std:: intptr_t >
(typedef)
(C++11) (optionnel)
std:: atomic < std:: uintptr_t >
(typedef)
std:: atomic < std:: size_t >
(typedef)
std:: atomic < std:: ptrdiff_t >
(typedef)
std:: atomic < std:: intmax_t >
(typedef)
std:: atomic < std:: uintmax_t >
(typedef)
un type atomique entier signé sans verrouillage pour lequel l'attente/la notification est la plus efficace
(typedef)
un type atomique entier non signé sans verrouillage et pour lequel l'attente/la notification est la plus efficace
(typedef)

Fonctions

vérifie si les opérations du type atomique sont sans verrou
(modèle de fonction)
remplace atomiquement la valeur de l'objet atomique par un argument non atomique
(modèle de fonction)
obtient atomiquement la valeur stockée dans un objet atomique
(modèle de fonction)
remplace atomiquement la valeur de l'objet atomique par l'argument non atomique et retourne l'ancienne valeur de l'atome
(modèle de fonction)
compare atomiquement la valeur de l'objet atomique avec l'argument non-atomique et effectue un échange atomique si égal ou un chargement atomique sinon
(modèle de fonction)
ajoute une valeur non atomique à un objet atomique et obtient la valeur précédente de l'atome
(modèle de fonction)
soustrait une valeur non atomique d'un objet atomique et obtient la valeur précédente de l'atome
(modèle de fonction)
remplace l'objet atomique par le résultat du ET binaire avec un argument non atomique et obtient la valeur précédente de l'atome
(modèle de fonction)
remplace l'objet atomique par le résultat du OU binaire avec un argument non atomique et obtient la valeur précédente de l'atome
(modèle de fonction)
remplace l'objet atomique par le résultat du XOR bit à bit avec un argument non atomique et obtient la valeur précédente de l'atome
(modèle de fonction)
remplace l'objet atomique par le résultat de std::max avec un argument non atomique et obtient la valeur précédente de l'atome
(modèle de fonction)
remplace l'objet atomique par le résultat de std::min avec un argument non atomique et obtient la valeur précédente de l'atome
(modèle de fonction)
bloque le thread jusqu'à notification et changement de la valeur atomique
(modèle de fonction)
notifie un thread bloqué dans atomic_wait
(modèle de fonction)
notifie tous les threads bloqués dans atomic_wait
(modèle de fonction)
retourne atomiquement la valeur du drapeau
(fonction)
définit atomiquement le drapeau à true et retourne sa valeur précédente
(fonction)
définit atomiquement la valeur du drapeau à false
(fonction)
bloque le thread jusqu'à notification et changement du drapeau
(fonction)
notifie un thread bloqué dans atomic_flag_wait
(fonction)
notifie tous les threads bloqués dans atomic_flag_wait
(fonction)
(C++11) (obsolète en C++20)
initialisation non atomique d'un objet atomic construit par défaut
(modèle de fonction)
(C++11) (déprécié en C++26)
supprime l'objet spécifié de l'arbre de dépendances std::memory_order_consume
(modèle de fonction)
primitive de synchronisation de barrière mémoire générique dépendant de l'ordre mémoire
(fonction)
barrière entre un thread et un gestionnaire de signal exécuté dans le même thread
(fonction)

Macros

(C++11) (obsolète en C++20)
initialisation constante d'une variable atomique de durée de stockage statique
(macro de fonction)
initialise un std::atomic_flag à false
(constante macro)

Synopsis

namespace std {
  /* jusqu'à C++20 :
  enum memory_order {
    memory_order_relaxed,
    memory_order_consume,
    memory_order_acquire,
    memory_order_release,
    memory_order_acq_rel,
    memory_order_seq_cst
  };
  */
  enum class memory_order : /* non spécifié */;
  inline constexpr memory_order memory_order_relaxed = memory_order::relaxed;
  inline constexpr memory_order memory_order_consume = memory_order::consommer;
  inline constexpr memory_order memory_order_acquire = memory_order::acquérir;
  inline constexpr memory_order memory_order_release = memory_order::release;
  inline constexpr memory_order memory_order_acq_rel = memory_order::acq_rel;
  inline constexpr memory_order memory_order_seq_cst = memory_order::seq_cst;
  template<class T>
    T kill_dependency(T y) noexcept;
  // propriété sans verrouillage
  #define ATOMIC_BOOL_LOCK_FREE /* non spécifié */
  #define ATOMIC_CHAR_LOCK_FREE /* non spécifié */
  #define ATOMIC_CHAR8_T_LOCK_FREE /* non spécifié */
  #define ATOMIC_CHAR16_T_LOCK_FREE /* non spécifié */
  #define ATOMIC_CHAR32_T_LOCK_FREE /* non spécifié */
  #define ATOMIC_WCHAR_T_LOCK_FREE /* non spécifié */
  #define ATOMIC_SHORT_LOCK_FREE /* non spécifié */
  #define ATOMIC_INT_LOCK_FREE /* non spécifié */
  #define ATOMIC_LONG_LOCK_FREE /* non spécifié */
  #define ATOMIC_LLONG_LOCK_FREE /* non spécifié */
  #define ATOMIC_POINTER_LOCK_FREE /* non spécifié */
  // modèle de classe atomic_ref
  template<class T> struct atomic_ref;
  // spécialisation partielle pour les pointeurs
  template<class T> struct atomic_ref<T*>;
  // modèle de classe atomic
  template<class T> struct atomic;
  // spécialisation partielle pour les pointeurs
  template<class T> struct atomic<T*>;
  // fonctions non membres
  template<class T>
    bool atomic_is_lock_free(const volatile atomic<T>*) noexcept;
  template<class T>
    bool atomic_is_lock_free(const atomic<T>*) noexcept;
  template<class T>
    void atomic_store(volatile atomic<T>*, typename atomic<T>::value_type) noexcept;
  template<class T>
    void atomic_store(atomic<T>*, typename atomic<T>::value_type) noexcept;
  template<class T>
    void atomic_store_explicit(volatile atomic<T>*, typename atomic<T>::value_type,
                               memory_order) noexcept;
  template<class T>
    void atomic_store_explicit(atomic<T>*, typename atomic<T>::value_type,
                               memory_order) noexcept;
  template<class T>
    T atomic_load(const volatile atomic<T>*) noexcept;
  template<class T>
    T atomic_load(const atomic<T>*) noexcept;
  template<class T>
    T atomic_load_explicit(const volatile atomic<T>*, memory_order) noexcept;
  template<class T>
    T atomic_load_explicit(const atomic<T>*, memory_order) noexcept;
  template<class T>
    T atomic_exchange(volatile atomic<T>*, typename atomic<T>::value_type) noexcept;
  template<class T>
    T atomic_exchange(atomic<T>*, typename atomic<T>::value_type) noexcept;
  template<class T>
    T atomic_exchange_explicit(volatile atomic<T>*, typename atomic<T>::value_type,
                               memory_order) noexcept;
  template<class T>
    T atomic_exchange_explicit(atomic<T>*, typename atomic<T>::value_type,
                               memory_order) noexcept;
  template<class T>
    bool atomic_compare_exchange_weak(volatile atomic<T>*,
                                      typename atomic<T>::value_type*,
                                      typename atomic<T>::value_type) noexcept;
  template<class T>
    bool atomic_compare_exchange_weak(atomic<T>*,
                                      typename atomic<T>::value_type*,
                                      typename atomic<T>::value_type) noexcept;
  template<class T>
    bool atomic_compare_exchange_strong(volatile atomic<T>*,
                                        typename atomic<T>::value_type*,
                                        typename atomic<T>::value_type) noexcept;
  template<class T>
    bool atomic_compare_exchange_strong(atomic<T>*,
                                        typename atomic<T>::value_type*,
                                        typename atomic<T>::value_type) noexcept;
  template<class T>
    bool atomic_compare_exchange_weak_explicit(volatile atomic<T>*,
                                               typename atomic<T>::value_type*,
                                               typename atomic<T>::value_type,
                                               memory_order, memory_order) noexcept;
  template<class T>
    bool atomic_compare_exchange_weak_explicit(atomic<T>*,
                                               typename atomic<T>::value_type*,
                                               typename atomic<T>::value_type,
                                               memory_order, memory_order) noexcept;
  template<class T>
    bool atomic_compare_exchange_strong_explicit(volatile atomic<T>*,
                                                 typename atomic<T>::value_type*,
                                                 typename atomic<T>::value_type,
                                                 memory_order, memory_order) noexcept;
  template<class T>
    bool atomic_compare_exchange_strong_explicit(atomic<T>*,
                                                 typename atomic<T>::value_type*,
                                                 typename atomic<T>::value_type,
                                                 memory_order, memory_order) noexcept;
  template<class T>
    T atomic_fetch_add(volatile atomic<T>*, typename atomic<T>::difference_type) noexcept;
  template<class T>
    T atomic_fetch_add(atomic<T>*, typename atomic<T>::difference_type) noexcept;
  template<class T>
    T atomic_fetch_add_explicit(volatile atomic<T>*, typename atomic<T>::difference_type,
                                memory_order) noexcept;
  template<class T>
    T atomic_fetch_add_explicit(atomic<T>*, typename atomic<T>::difference_type,
                                memory_order) noexcept;
  template<class T>
    T atomic_fetch_sub(volatile atomic<T>*, typename atomic<T>::difference_type) noexcept;
  template<class T>
    T atomic_fetch_sub(atomic<T>*, typename atomic<T>::difference_type) noexcept;
  template<class T>
    T atomic_fetch_sub_explicit(volatile atomic<T>*, typename atomic<T>::difference_type,
                                memory_order) noexcept;
  template<class T>
    T atomic_fetch_sub_explicit(atomic<T>*, typename atomic<T>::difference_type,
                                memory_order) noexcept;
  template<class T>
    T atomic_fetch_and(volatile atomic<T>*, typename atomic<T>::value_type) noexcept;
  template<class T>
    T atomic_fetch_and(atomic<T>*, typename atomic<T>::value_type) noexcept;
  template<class T>
    T atomic_fetch_and_explicit(volatile atomic<T>*, typename atomic<T>::value_type,
                                memory_order) noexcept;
  template<class T>
    T atomic_fetch_and_explicit(atomic<T>*, typename atomic<T>::value_type,
                                memory_order) noexcept;
  template<class T>
    T atomic_fetch_or(volatile atomic<T>*, typename atomic<T>::value_type) noexcept;
  template<class T>
    T atomic_fetch_or(atomic<T>*, typename atomic<T>::value_type) noexcept;
  template<class T>
    T atomic_fetch_or_explicit(volatile atomic<T>*, typename atomic<T>::value_type,
                               memory_order) noexcept;
  template<class T>
    T atomic_fetch_or_explicit(atomic<T>*, typename atomic<T>::value_type,
                               memory_order) noexcept;
  template<class T>
    T atomic_fetch_xor(volatile atomic<T>*, typename atomic<T>::value_type) noexcept;
  template<class T>
    T atomic_fetch_xor(atomic<T>*, typename atomic<T>::value_type) noexcept;
  template<class T>
    T atomic_fetch_xor_explicit(volatile atomic<T>*, typename atomic<T>::value_type,
                                memory_order) noexcept;
  template<class T>
    T atomic_fetch_xor_explicit(atomic<T>*, typename atomic<T>::value_type,
                                memory_order) noexcept;
  template<class T>
    T atomic_fetch_max(volatile atomic<T>*, typename atomic<T>::value_type) noexcept;
  template<class T>
    T atomic_fetch_max(atomic<T>*, typename atomic<T>::value_type) noexcept;
  template<class T>
    T atomic_fetch_max_explicit(volatile atomic<T>*, typename atomic<T>::value_type,
                                memory_order) noexcept;
  template<class T>
    T atomic_fetch_max_explicit(atomic<T>*, typename atomic<T>::value_type,
                                memory_order) noexcept;
  template<class T>
    T atomic_fetch_min(volatile atomic<T>*, typename atomic<T>::value_type) noexcept;
  template<class T>
    T atomic_fetch_min(atomic<T>*, typename atomic<T>::value_type) noexcept;
  template<class T>
    T atomic_fetch_min_explicit(volatile atomic<T>*, typename atomic<T>::value_type,
                                memory_order) noexcept;
  template<class T>
    T atomic_fetch_min_explicit(atomic<T>*, typename atomic<T>::value_type,
                                memory_order) noexcept;
  template<class T>
    void atomic_wait(const volatile atomic<T>*, typename atomic<T>::value_type);
  template<class T>
    void atomic_wait(const atomic<T>*, typename atomic<T>::value_type);
  template<class T>
    void atomic_wait_explicit(const volatile atomic<T>*,
                              typename atomic<T>::value_type, memory_order);
  template<class T>
    void atomic_wait_explicit(const atomic<T>*,
                              typename atomic<T>::value_type, memory_order);
  template<class T>
    void atomic_notify_one(volatile atomic<T>*);
  template<class T>
    void atomic_notify_one(atomic<T>*);
  template<class T>
    void atomic_notify_all(volatile atomic<T>*);
  template<class T>
    void atomic_notify_all(atomic<T>*);
  // alias de types
  using atomic_bool           = atomic<bool>;
  using atomic_char           = atomic<char>;
  using atomic_schar          = atomic<signed char>;
  using atomic_uchar          = atomic<unsigned char>;
  using atomic_short          = atomic<short>;
  using atomic_ushort         = atomic<unsigned short>;
  using atomic_int            = atomic<int>;
  using atomic_uint           = atomic<unsigned int>;
  using atomic_long           = atomic<long>;
  using atomic_ulong          = atomic<unsigned long>;
  using atomic_llong          = atomic<long long>;
  using atomic_ullong         = atomic<unsigned long long>;
  using atomic_char8_t        = atomic<char8_t>;
  using atomic_char16_t       = atomic<char16_t>;
  using atomic_char32_t       = atomic<char32_t>;
  using atomic_wchar_t        = atomic<wchar_t>;
  using atomic_int8_t         = atomic<int8_t>;
  using atomic_uint8_t        = atomic<uint8_t>;
  using atomic_int16_t        = atomic<int16_t>;
  using atomic_uint16_t       = atomic<uint16_t>;
  using atomic_int32_t        = atomic<int32_t>;
  using atomic_uint32_t       = atomic<uint32_t>;
  using atomic_int64_t        = atomic<int64_t>;
  using atomic_uint64_t       = atomic<uint64_t>;
  using atomic_int_least8_t   = atomic<int_least8_t>;
  using atomic_uint_least8_t  = atomic<uint_least8_t>;
  using atomic_int_least16_t  = atomic<int_least16_t>;
  using atomic_uint_least16_t = atomic<uint_least16_t>;
  using atomic_int_least32_t  = atomic<int_least32_t>;
  using atomic_uint_least32_t = atomic<uint_least32_t>;
  using atomic_int_least64_t  = atomic<int_least64_t>;
  using atomic_uint_least64_t = atomic<uint_least64_t>;
  using atomic_int_fast8_t    = atomic<int_fast8_t>;
  using atomic_uint_fast8_t   = atomic<uint_fast8_t>;
  using atomic_int_fast16_t   = atomic<int_fast16_t>;
  using atomic_uint_fast16_t  = atomic<uint_fast16_t>;
  using atomic_int_fast32_t   = atomic<int_fast32_t>;
  using atomic_uint_fast32_t  = atomic<uint_fast32_t>;
  using atomic_int_fast64_t   = atomic<int_fast64_t>;
  using atomic_uint_fast64_t  = atomic<uint_fast64_t>;
  using atomic_intptr_t       = atomic<intptr_t>;
  using atomic_uintptr_t      = atomic<uintptr_t>;
  using atomic_size_t         = atomic<size_t>;
  using atomic_ptrdiff_t      = atomic<ptrdiff_t>;
  using atomic_intmax_t       = atomic<intmax_t>;
  using atomic_uintmax_t      = atomic<uintmax_t>;
  using atomic_signed_lock_free   = /* voir description */;
  using atomic_unsigned_lock_free = /* voir description */;
  // type de drapeau et opérations
  struct atomic_flag;
  bool atomic_flag_test(const volatile atomic_flag*) noexcept;
  bool atomic_flag_test(const atomic_flag*) noexcept;
  bool atomic_flag_test_explicit(const volatile atomic_flag*, memory_order) noexcept;
  bool atomic_flag_test_explicit(const atomic_flag*, memory_order) noexcept;
  bool atomic_flag_test_and_set(volatile atomic_flag*) noexcept;
  bool atomic_flag_test_and_set(atomic_flag*) noexcept;
  bool atomic_flag_test_and_set_explicit(volatile atomic_flag*, memory_order) noexcept;
  bool atomic_flag_test_and_set_explicit(atomic_flag*, memory_order) noexcept;
  void atomic_flag_clear(volatile atomic_flag*) noexcept;
  void atomic_flag_clear(atomic_flag*) noexcept;
  void atomic_flag_clear_explicit(volatile atomic_flag*, memory_order) noexcept;
  void atomic_flag_clear_explicit(atomic_flag*, memory_order) noexcept;
  void atomic_flag_wait(const volatile atomic_flag*, bool) noexcept;
  void atomic_flag_wait(const atomic_flag*, bool) noexcept;
  void atomic_flag_wait_explicit(const volatile atomic_flag*,
                                 bool, memory_order) noexcept;
  void atomic_flag_wait_explicit(const atomic_flag*,
                                 bool, memory_order) noexcept;
  void atomic_flag_notify_one(volatile atomic_flag*) noexcept;
  void atomic_flag_notify_one(atomic_flag*) noexcept;
  void atomic_flag_notify_all(volatile atomic_flag*) noexcept;
  void atomic_flag_notify_all(atomic_flag*) noexcept;
  // barrières mémoire
  extern "C" void atomic_thread_fence(memory_order) noexcept;
  extern "C" void atomic_signal_fence(memory_order) noexcept;
}
// obsolète
namespace std {
  template<class T>
    void atomic_init(volatile atomic<T>*, typename atomic<T>::value_type) noexcept;
  template<class T>
    void atomic_init(atomic<T>*, typename atomic<T>::value_type) noexcept;
  #define ATOMIC_VAR_INIT(value) /* voir description */
  #define ATOMIC_FLAG_INIT /* voir description */
}

Modèle de classe std::atomic

namespace std {
  template<class T> struct atomic {
    using value_type = T;
    static constexpr bool is_always_lock_free = /* défini par l'implémentation */;
    bool is_lock_free() const volatile noexcept;
    bool is_lock_free() const noexcept;
    // opérations sur les types atomiques
    constexpr atomic() noexcept(is_nothrow_default_constructible_v<T>);
    constexpr atomic(T) noexcept;
    atomic(const atomic&) = delete;
    atomic& operator=(const atomic&) = delete;
    atomic& operator=(const atomic&) volatile = delete;
    T load(memory_order = memory_order::seq_cst) const volatile noexcept;
    T load(memory_order = memory_order::seq_cst) const noexcept;
    operator T() const volatile noexcept;
    operator T() const noexcept;
    void store(T, memory_order = memory_order::seq_cst) volatile noexcept;
    void store(T, memory_order = memory_order::seq_cst) noexcept;
    T operator=(T) volatile noexcept;
    T operator=(T) noexcept;
    T exchange(T, memory_order = memory_order::seq_cst) volatile noexcept;
    T exchange(T, memory_order = memory_order::seq_cst) noexcept;
    bool compare_exchange_weak(T&, T, memory_order, memory_order) volatile noexcept;
    bool compare_exchange_weak(T&, T, memory_order, memory_order) noexcept;
    bool compare_exchange_strong(T&, T, memory_order, memory_order) volatile noexcept;
    bool compare_exchange_strong(T&, T, memory_order, memory_order) noexcept;
    bool compare_exchange_weak(T&, T,
                               memory_order = memory_order::seq_cst) volatile noexcept;
    bool compare_exchange_weak(T&, T, memory_order = memory_order::seq_cst) noexcept;
    bool compare_exchange_strong(T&, T,
                                 memory_order = memory_order::seq_cst) volatile noexcept;
    bool compare_exchange_strong(T&, T, memory_order = memory_order::seq_cst) noexcept;
    void wait(T, memory_order = memory_order::seq_cst) const volatile noexcept;
    void wait(T, memory_order = memory_order::seq_cst) const noexcept;
    void notify_one() volatile noexcept;
    void notify_one() noexcept;
    void notify_all() volatile noexcept;
    void notify_all() noexcept;
  };
}

Spécialisations de std::atomic pour les types entiers

namespace std {
  template<> struct atomic</* intégral */> {
    using value_type = /* intégral */;
    using difference_type = value_type;
    static constexpr bool is_always_lock_free = /* défini par l'implémentation */;
    bool is_lock_free() const volatile noexcept;
    bool is_lock_free() const noexcept;
    constexpr atomic() noexcept;
    constexpr atomic(/* intégral */) noexcept;
    atomic(const atomic&) = delete;
    atomic& operator=(const atomic&) = delete;
    atomic& operator=(const atomic&) volatile = delete;
    void store(/* intégral */, memory_order = memory_order::seq_cst) volatile noexcept;
    void store(/* intégral */, memory_order = memory_order::seq_cst) noexcept;
    /* intégral */ operator=(/* intégral */) volatile noexcept;
    /* intégral */ operator=(/* intégral */) noexcept;
    /* intégral */ load(memory_order = memory_order::seq_cst) const volatile noexcept;
    /* intégral */ load(memory_order = memory_order::seq_cst) const noexcept;
    operator /* intégral */() const volatile noexcept;
    operator /* intégral */() const noexcept;
    /* intégral */ exchange(/* intégral */,
                        memory_order = memory_order::seq_cst) volatile noexcept;
    /* intégral */ exchange(/* intégral */,
                        memory_order = memory_order::seq_cst) noexcept;
    bool compare_exchange_weak(/* intégral */&, /* intégral */,
                               memory_order, memory_order) volatile noexcept;
    bool compare_exchange_weak(/* intégral */&, /* intégral */,
                               memory_order, memory_order) noexcept;
    bool compare_exchange_strong(/* intégral */&, /* intégral */,
                                 memory_order, memory_order) volatile noexcept;
    bool compare_exchange_strong(/* intégral */&, /* intégral */,
                                 memory_order, memory_order) noexcept;
    bool compare_exchange_weak(/* intégral */&, /* intégral */,
                               memory_order = memory_order::seq_cst) volatile noexcept;
    bool compare_exchange_weak(/* intégral */&, /* intégral */,
                               memory_order = memory_order::seq_cst) noexcept;
    bool compare_exchange_strong(/* intégral */&, /* intégral */,
                                 memory_order = memory_order::seq_cst) volatile noexcept;
    bool compare_exchange_strong(/* intégral */&, /* intégral */,
                                 memory_order = memory_order::seq_cst) noexcept;
    /* intégral */ fetch_add(/* intégral */,
                         memory_order = memory_order::seq_cst) volatile noexcept;
    /* intégral */ fetch_add(/* intégral */,
                         memory_order = memory_order::seq_cst) noexcept;
    /* intégral */ fetch_sub(/* intégral */,
                         memory_order = memory_order::seq_cst) volatile noexcept;
    /* intégral */ fetch_sub(/* intégral */,
                         memory_order = memory_order::seq_cst) noexcept;
    /* intégral */ fetch_and(/* intégral */,
                         memory_order = memory_order::seq_cst) volatile noexcept;
    /* intégral */ fetch_and(/* intégral */,
                         memory_order = memory_order::seq_cst) noexcept;
    /* intégral */ fetch_or(/* intégral */,
                         memory_order = memory_order::seq_cst) volatile noexcept;
    /* intégral */ fetch_or(/* intégral */,
                         memory_order = memory_order::seq_cst) noexcept;
    /* intégral */ fetch_xor(/* intégral */,
                         memory_order = memory_order::seq_cst) volatile noexcept;
    /* intégral */ fetch_xor(/* intégral */,
                         memory_order = memory_order::seq_cst) noexcept;
    /* intégral */ fetch_max(/* intégral */,
                         memory_order = memory_order::seq_cst) volatile noexcept;
    /* intégral */ fetch_max(/* intégral */,
                         memory_order = memory_order::seq_cst) noexcept;
    /* intégral */ fetch_min(/* intégral */,
                         memory_order = memory_order::seq_cst) volatile noexcept;
    /* intégral */ fetch_min(/* intégral */,
                         memory_order = memory_order::seq_cst) noexcept;
    /* intégral */ operator++(int) volatile noexcept;
    /* intégral */ operator++(int) noexcept;
    /* intégral */ operator--(int) volatile noexcept;
    /* intégral */ operator--(int) noexcept;
    /* intégral */ operator++() volatile noexcept;
    /* intégral */ operator++() noexcept;
    /* intégral */ operator--() volatile noexcept;
    /* intégral */ operator--() noexcept;
    /* intégral */ operator+=(/* intégral */) volatile noexcept;
    /* intégral */ operator+=(/* intégral */) noexcept;
    /* intégral */ operator-=(/* intégral */) volatile noexcept;
    /* intégral */ operator-=(/* intégral */) noexcept;
    /* intégral */ operator&=(/* intégral */) volatile noexcept;
    /* intégral */ operator&=(/* intégral */) noexcept;
    /* intégral */ operator|=(/* intégral */) volatile noexcept;
    /* intégral */ operator|=(/* intégral */) noexcept;
    /* intégral */ operator^=(/* intégral */) volatile noexcept;
    /* intégral */ operator^=(/* intégral */) noexcept;
    void wait(/* intégral */,
              memory_order = memory_order::seq_cst) const volatile noexcept;
    void wait(/* intégral */, memory_order = memory_order::seq_cst) const noexcept;
    void notify_one() volatile noexcept;
    void notify_one() noexcept;
    void notify_all() volatile noexcept;
    void notify_all() noexcept;
  };
}

Spécialisations de std::atomic pour les types à virgule flottante

namespace std {
  template<> struct atomic</* virgule flottante */> {
    using value_type = /* virgule flottante */;
    using difference_type = value_type;
    static constexpr bool is_always_lock_free = /* défini par l'implémentation */;
    bool is_lock_free() const volatile noexcept;
    bool is_lock_free() const noexcept;
    constexpr atomic() noexcept;
    constexpr atomic(/* virgule flottante */) noexcept;
    atomic(const atomic&) = delete;
    atomic& operator=(const atomic&) = delete;
    atomic& operator=(const atomic&) volatile = delete;
    void store(/* virgule flottante */,
               memory_order = memory_order_seq_cst) volatile noexcept;
    void store(/* virgule flottante */,
               memory_order = memory_order_seq_cst) noexcept;
    /* virgule flottante */ operator=(/* virgule flottante */) volatile noexcept;
    /* virgule flottante */ operator=(/* virgule flottante */) noexcept;
    /* virgule flottante */ load(memory_order = memory_order_seq_cst) volatile noexcept;
    /* virgule flottante */ load(memory_order = memory_order_seq_cst) noexcept;
    operator /* virgule flottante */() volatile noexcept;
    operator /* virgule flottante */() noexcept;
    /* virgule flottante */ exchange(/* virgule flottante */,
                            memory_order = memory_order_seq_cst) volatile noexcept;
    /* virgule flottante */ exchange(/* virgule flottante */,
                            memory_order = memory_order_seq_cst) noexcept;
    bool compare_exchange_weak(/* virgule flottante */&, /* virgule flottante */,
                               memory_order, memory_order) volatile noexcept;
    bool compare_exchange_weak(/* virgule flottante */&, /* virgule flottante */,
                               memory_order, memory_order) noexcept;
    bool compare_exchange_strong(/* virgule flottante */&, /* virgule flottante */,
                                 memory_order, memory_order) volatile noexcept;
    bool compare_exchange_strong(/* virgule flottante */&, /* virgule flottante */,
                                 memory_order, memory_order) noexcept;
    bool compare_exchange_weak(/* virgule flottante */&, /* virgule flottante */,
                               memory_order = memory_order_seq_cst) volatile noexcept;
    bool compare_exchange_weak(/* virgule flottante */&, /* virgule flottante */,
                               memory_order = memory_order_seq_cst) noexcept;
    bool compare_exchange_strong(/* virgule flottante */&, /* virgule flottante */,
                                 memory_order = memory_order_seq_cst) volatile noexcept;
    bool compare_exchange_strong(/* virgule flottante */&, /* virgule flottante */,
                                 memory_order = memory_order_seq_cst) noexcept;
    /* virgule flottante */ fetch_add(/* virgule flottante */,
                             memory_order = memory_order_seq_cst) volatile noexcept;
    /* virgule flottante */ fetch_add(/* virgule flottante */,
                             memory_order = memory_order_seq_cst) noexcept;
    /* virgule flottante */ fetch_sub(/* virgule flottante */,
                             memory_order = memory_order_seq_cst) volatile noexcept;
    /* virgule flottante */ fetch_sub(/* virgule flottante */,
                             memory_order = memory_order_seq_cst) noexcept;
    /* virgule flottante */ operator+=(/* virgule flottante */) volatile noexcept;
    /* virgule flottante */ operator+=(/* virgule flottante */) noexcept;
    /* virgule flottante */ operator-=(/* virgule flottante */) volatile noexcept;
    /* virgule flottante */ operator-=(/* virgule flottante */) noexcept;
    void wait(/* virgule flottante */,
              memory_order = memory_order::seq_cst) const volatile noexcept;
    void wait(/* virgule flottante */,
              memory_order = memory_order::seq_cst) const noexcept;
    void notify_one() volatile noexcept;
    void notify_one() noexcept;
    void notify_all() volatile noexcept;
    void notify_all() noexcept;
  };
}

Spécialisations de std::atomic pour les types pointeurs

namespace std {
  template<class T> struct atomic<T*> {
    using value_type = T*;
    using difference_type = ptrdiff_t;
    static constexpr bool is_always_lock_free = /* défini par l'implémentation */;
    bool is_lock_free() const volatile noexcept;
    bool is_lock_free() const noexcept;
    constexpr atomic() noexcept;
    constexpr atomic(T*) noexcept;
    atomic(const atomic&) = delete;
    atomic& operator=(const atomic&) = delete;
    atomic& operator=(const atomic&) volatile = delete;
    void store(T*, memory_order = memory_order::seq_cst) volatile noexcept;
    void store(T*, memory_order = memory_order::seq_cst) noexcept;
    T* operator=(T*) volatile noexcept;
    T* operator=(T*) noexcept;
    T* load(memory_order = memory_order::seq_cst) const volatile noexcept;
    T* load(memory_order = memory_order::seq_cst) const noexcept;
    operator T*() const volatile noexcept;
    operator T*() const noexcept;
    T* exchange(T*, memory_order = memory_order::seq_cst) volatile noexcept;
    T* exchange(T*, memory_order = memory_order::seq_cst) noexcept;
    bool compare_exchange_weak(T*&, T*, memory_order, memory_order) volatile noexcept;
    bool compare_exchange_weak(T*&, T*, memory_order, memory_order) noexcept;
    bool compare_exchange_strong(T*&, T*, memory_order, memory_order) volatile noexcept;
    bool compare_exchange_strong(T*&, T*, memory_order, memory_order) noexcept;
    bool compare_exchange_weak(T*&, T*,
                               memory_order = memory_order::seq_cst) volatile noexcept;
    bool compare_exchange_weak(T*&, T*,
                               memory_order = memory_order::seq_cst) noexcept;
    bool compare_exchange_strong(T*&, T*,
                                 memory_order = memory_order::seq_cst) volatile noexcept;
    bool compare_exchange_strong(T*&, T*,
                                 memory_order = memory_order::seq_cst) noexcept;
    T* fetch_add(ptrdiff_t, memory_order = memory_order::seq_cst) volatile noexcept;
    T* fetch_add(ptrdiff_t, memory_order = memory_order::seq_cst) noexcept;
    T* fetch_sub(ptrdiff_t, memory_order = memory_order::seq_cst) volatile noexcept;
    T* fetch_sub(ptrdiff_t, memory_order = memory_order::seq_cst) noexcept;
    T* fetch_max(T*, memory_order = memory_order::seq_cst) volatile noexcept;
    T* fetch_max(T*, memory_order = memory_order::seq_cst) noexcept;
    T* fetch_min(T*, memory_order = memory_order::seq_cst) volatile noexcept;
    T* fetch_min(T*, memory_order = memory_order::seq_cst) noexcept;
    T* operator++(int) volatile noexcept;
    T* operator++(int) noexcept;
    T* operator--(int) volatile noexcept;
    T* operator--(int) noexcept;
    T* operator++() volatile noexcept;
    T* operator++() noexcept;
    T* operator--() volatile noexcept;
    T* operator--() noexcept;
    T* operator+=(ptrdiff_t) volatile noexcept;
    T* operator+=(ptrdiff_t) noexcept;
    T* operator-=(ptrdiff_t) volatile noexcept;
    T* operator-=(ptrdiff_t) noexcept;
    void wait(T*, memory_order = memory_order::seq_cst) const volatile noexcept;
    void wait(T*, memory_order = memory_order::seq_cst) const noexcept;
    void notify_one() volatile noexcept;
    void notify_one() noexcept;
    void notify_all() volatile noexcept;
    void notify_all() noexcept;
  };
}

Modèle de classe std:: atomic_ref

namespace std {
  template<class T> struct atomic_ref {
  private:
    T* ptr;             // exposition uniquement
  public:
    using value_type = T;
    static constexpr size_t required_alignment = /* défini par l'implémentation */;
    static constexpr bool is_always_lock_free = /* défini par l'implémentation */;
    bool is_lock_free() const noexcept;
    explicit atomic_ref(T&);
    atomic_ref(const atomic_ref&) noexcept;
    atomic_ref& operator=(const atomic_ref&) = delete;
    void store(T, memory_order = memory_order_seq_cst) const noexcept;
    T operator=(T) const noexcept;
    T load(memory_order = memory_order_seq_cst) const noexcept;
    operator T() const noexcept;
    T exchange(T, memory_order = memory_order_seq_cst) const noexcept;
    bool compare_exchange_weak(T&, T,
                               memory_order, memory_order) const noexcept;
    bool compare_exchange_strong(T&, T,
                                 memory_order, memory_order) const noexcept;
    bool compare_exchange_weak(T&, T,
                               memory_order = memory_order_seq_cst) const noexcept;
    bool compare_exchange_strong(T&, T,
                                 memory_order = memory_order_seq_cst) const noexcept;
    void wait(T, memory_order = memory_order::seq_cst) const noexcept;
    void notify_one() const noexcept;
    void notify_all() const noexcept;
  };
}

Spécialisations de std:: atomic_ref pour les types entiers

namespace std {
  template<> struct atomic_ref</* integral */> {
  private:
    /* integral */* ptr;        // exposition uniquement
  public:
    using value_type = /* integral */;
    using difference_type = value_type;
    static constexpr size_t required_alignment = /* implementation-defined */;
    static constexpr bool is_always_lock_free = /* implementation-defined */;
    bool is_lock_free() const noexcept;
    explicit atomic_ref(/* integral */&);
    atomic_ref(const atomic_ref&) noexcept;
    atomic_ref& operator=(const atomic_ref&) = delete;
    void store(/* integral */, memory_order = memory_order_seq_cst) const noexcept;
    /* integral */ operator=(/* integral */) const noexcept;
    /* integral */ load(memory_order = memory_order_seq_cst) const noexcept;
    operator /* integral */() const noexcept;
    /* integral */ exchange(/* integral */,
                      memory_order = memory_order_seq_cst) const noexcept;
    bool compare_exchange_weak(/* integral */&, /* integral */,
                               memory_order, memory_order) const noexcept;
    bool compare_exchange_strong(/* integral */&, /* integral */,
                                 memory_order, memory_order) const noexcept;
    bool compare_exchange_weak(/* integral */&, /* integral */,
                               memory_order = memory_order_seq_cst) const noexcept;
    bool compare_exchange_strong(/* integral */&, /* integral */,
                                 memory_order = memory_order_seq_cst) const noexcept;
    /* integral */ fetch_add(/* integral */,
                       memory_order = memory_order_seq_cst) const noexcept;
    /* integral */ fetch_sub(/* integral */,
                       memory_order = memory_order_seq_cst) const noexcept;
    /* integral */ fetch_and(/* integral */,
                       memory_order = memory_order_seq_cst) const noexcept;
    /* integral */ fetch_or(/* integral */,
                      memory_order = memory_order_seq_cst) const noexcept;
    /* integral */ fetch_xor(/* integral */,
                       memory_order = memory_order_seq_cst) const noexcept;
    /* integral */ fetch_max(/* integral */,
                       memory_order = memory_order_seq_cst) const noexcept;
    /* integral */ fetch_min(/* integral */,
                       memory_order = memory_order_seq_cst) const noexcept;
    /* integral */ operator++(int) const noexcept;
    /* integral */ operator--(int) const noexcept;
    /* integral */ operator++() const noexcept;
    /* integral */ operator--() const noexcept;
    /* integral */ operator+=(/* integral */) const noexcept;
    /* integral */ operator-=(/* integral */) const noexcept;
    /* integral */ operator&=(/* integral */) const noexcept;
    /* integral */ operator

Spécialisations de std:: atomic_ref pour les types à virgule flottante

namespace std {
  template<> struct atomic_ref</* floating-point */> {
  private:
    /* floating-point */* ptr;  // exposition uniquement
  public:
    using value_type = /* floating-point */;
    using difference_type = value_type;
    static constexpr size_t required_alignment = /* défini par l'implémentation */;
    static constexpr bool is_always_lock_free = /* défini par l'implémentation */;
    bool is_lock_free() const noexcept;
    explicit atomic_ref(/* floating-point */&);
    atomic_ref(const atomic_ref&) noexcept;
    atomic_ref& operator=(const atomic_ref&) = delete;
    void store(/* floating-point */, memory_order = memory_order_seq_cst) const noexcept;
    /* floating-point */ operator=(/* floating-point */) const noexcept;
    /* floating-point */ load(memory_order = memory_order_seq_cst) const noexcept;
    operator /* floating-point */() const noexcept;
    /* floating-point */ exchange(/* floating-point */,
                            memory_order = memory_order_seq_cst) const noexcept;
    bool compare_exchange_weak(/* floating-point */&, /* floating-point */,
                               memory_order, memory_order) const noexcept;
    bool compare_exchange_strong(/* floating-point */&, /* floating-point */,
                                 memory_order, memory_order) const noexcept;
    bool compare_exchange_weak(/* floating-point */&, /* floating-point */,
                               memory_order = memory_order_seq_cst) const noexcept;
    bool compare_exchange_strong(/* floating-point */&, /* floating-point */,
                                 memory_order = memory_order_seq_cst) const noexcept;
    /* floating-point */ fetch_add(/* floating-point */,
                             memory_order = memory_order_seq_cst) const noexcept;
    /* floating-point */ fetch_sub(/* floating-point */,
                             memory_order = memory_order_seq_cst) const noexcept;
    /* floating-point */ operator+=(/* floating-point */) const noexcept;
    /* floating-point */ operator-=(/* floating-point */) const noexcept;
    void wait(/* floating-point */, memory_order = memory_order::seq_cst) const noexcept;
    void notify_one() const noexcept;
    void notify_all() const noexcept;
  };
}

Spécialisations de std:: atomic_ref pour les types pointeurs

namespace std {
  template<class T> struct atomic_ref<T*> {
  private:
    T** ptr;        // exposition uniquement
  public:
    using value_type = T*;
    using difference_type = ptrdiff_t;
    static constexpr size_t required_alignment = /* défini par l'implémentation */;
    static constexpr bool is_always_lock_free = /* défini par l'implémentation */;
    bool is_lock_free() const noexcept;
    explicit atomic_ref(T*&);
    atomic_ref(const atomic_ref&) noexcept;
    atomic_ref& operator=(const atomic_ref&) = delete;
    void store(T*, memory_order = memory_order_seq_cst) const noexcept;
    T* operator=(T*) const noexcept;
    T* load(memory_order = memory_order_seq_cst) const noexcept;
    operator T*() const noexcept;
    T* exchange(T*, memory_order = memory_order_seq_cst) const noexcept;
    bool compare_exchange_weak(T*&, T*,
                               memory_order, memory_order) const noexcept;
    bool compare_exchange_strong(T*&, T*,
                                 memory_order, memory_order) const noexcept;
    bool compare_exchange_weak(T*&, T*,
                               memory_order = memory_order_seq_cst) const noexcept;
    bool compare_exchange_strong(T*&, T*,
                                 memory_order = memory_order_seq_cst) const noexcept;
    T* fetch_add(difference_type, memory_order = memory_order_seq_cst) const noexcept;
    T* fetch_sub(difference_type, memory_order = memory_order_seq_cst) const noexcept;
    T* fetch_max(T *, memory_order = memory_order::seq_cst) const noexcept;
    T* fetch_min(T *, memory_order = memory_order::seq_cst) const noexcept;
    T* operator++(int) const noexcept;
    T* operator--(int) const noexcept;
    T* operator++() const noexcept;
    T* operator--() const noexcept;
    T* operator+=(difference_type) const noexcept;
    T* operator-=(difference_type) const noexcept;
    void wait(T*, memory_order = memory_order::seq_cst) const noexcept;
    void notify_one() const noexcept;
    void notify_all() const noexcept;
  };
}

Classe std::atomic_flag

namespace std {
  struct atomic_flag {
    constexpr atomic_flag() noexcept;
    atomic_flag(const atomic_flag&) = delete;
    atomic_flag& operator=(const atomic_flag&) = delete;
    atomic_flag& operator=(const atomic_flag&) volatile = delete;
    bool test(memory_order = memory_order::seq_cst) const volatile noexcept;
    bool test(memory_order = memory_order::seq_cst) const noexcept;
    bool test_and_set(memory_order = memory_order::seq_cst) volatile noexcept;
    bool test_and_set(memory_order = memory_order::seq_cst) noexcept;
    void clear(memory_order = memory_order::seq_cst) volatile noexcept;
    void clear(memory_order = memory_order::seq_cst) noexcept;
    void wait(bool, memory_order = memory_order::seq_cst) const volatile noexcept;
    void wait(bool, memory_order = memory_order::seq_cst) const noexcept;
    void notify_one() volatile noexcept;
    void notify_one() noexcept;
    void notify_all() volatile noexcept;
    void notify_all() noexcept;
  };
}