32 Concurrency support library [thread]

32.5 Atomic operations [atomics]

32.5.12 C compatibility [stdatomic.h.syn]

The header <stdatomic.h> provides the following definitions:
template<class T> using std-atomic = std::atomic<T>; / exposition only #define _Atomic(T) std-atomic<T> #define ATOMIC_BOOL_LOCK_FREE see below #define ATOMIC_CHAR_LOCK_FREE see below #define ATOMIC_CHAR16_T_LOCK_FREE see below #define ATOMIC_CHAR32_T_LOCK_FREE see below #define ATOMIC_WCHAR_T_LOCK_FREE see below #define ATOMIC_SHORT_LOCK_FREE see below #define ATOMIC_INT_LOCK_FREE see below #define ATOMIC_LONG_LOCK_FREE see below #define ATOMIC_LLONG_LOCK_FREE see below #define ATOMIC_POINTER_LOCK_FREE see below using std::memory_order; / see below using std::memory_order_relaxed; / see below using std::memory_order_consume; / see below using std::memory_order_acquire; / see below using std::memory_order_release; / see below using std::memory_order_acq_rel; / see below using std::memory_order_seq_cst; / see below using std::atomic_flag; / see below using std::atomic_bool; / see below using std::atomic_char; / see below using std::atomic_schar; / see below using std::atomic_uchar; / see below using std::atomic_short; / see below using std::atomic_ushort; / see below using std::atomic_int; / see below using std::atomic_uint; / see below using std::atomic_long; / see below using std::atomic_ulong; / see below using std::atomic_llong; / see below using std::atomic_ullong; / see below using std::atomic_char8_t; / see below using std::atomic_char16_t; / see below using std::atomic_char32_t; / see below using std::atomic_wchar_t; / see below using std::atomic_int8_t; / see below using std::atomic_uint8_t; / see below using std::atomic_int16_t; / see below using std::atomic_uint16_t; / see below using std::atomic_int32_t; / see below using std::atomic_uint32_t; / see below using std::atomic_int64_t; / see below using std::atomic_uint64_t; / see below using std::atomic_int_least8_t; / see below using std::atomic_uint_least8_t; / see below using std::atomic_int_least16_t; / see below using std::atomic_uint_least16_t; / see below using std::atomic_int_least32_t; / see below using std::atomic_uint_least32_t; / see below using std::atomic_int_least64_t; / see below using std::atomic_uint_least64_t; / see below using std::atomic_int_fast8_t; / see below using std::atomic_uint_fast8_t; / see below using std::atomic_int_fast16_t; / see below using std::atomic_uint_fast16_t; / see below using std::atomic_int_fast32_t; / see below using std::atomic_uint_fast32_t; / see below using std::atomic_int_fast64_t; / see below using std::atomic_uint_fast64_t; / see below using std::atomic_intptr_t; / see below using std::atomic_uintptr_t; / see below using std::atomic_size_t; / see below using std::atomic_ptrdiff_t; / see below using std::atomic_intmax_t; / see below using std::atomic_uintmax_t; / see below using std::atomic_is_lock_free; / see below using std::atomic_load; / see below using std::atomic_load_explicit; / see below using std::atomic_store; / see below using std::atomic_store_explicit; / see below using std::atomic_exchange; / see below using std::atomic_exchange_explicit; / see below using std::atomic_compare_exchange_strong; / see below using std::atomic_compare_exchange_strong_explicit; / see below using std::atomic_compare_exchange_weak; / see below using std::atomic_compare_exchange_weak_explicit; / see below using std::atomic_fetch_add; / see below using std::atomic_fetch_add_explicit; / see below using std::atomic_fetch_sub; / see below using std::atomic_fetch_sub_explicit; / see below using std::atomic_fetch_and; / see below using std::atomic_fetch_and_explicit; / see below using std::atomic_fetch_or; / see below using std::atomic_fetch_or_explicit; / see below using std::atomic_fetch_xor; / see below using std::atomic_fetch_xor_explicit; / see below using std::atomic_flag_test_and_set; / see below using std::atomic_flag_test_and_set_explicit; / see below using std::atomic_flag_clear; / see below using std::atomic_flag_clear_explicit; / see below #define ATOMIC_FLAG_INIT see below using std::atomic_thread_fence; / see below using std::atomic_signal_fence; / see below
Each using-declaration for some name A in the synopsis above makes available the same entity as std​::​A declared in <atomic>.
Each macro listed above other than _Atomic(T) is defined as in <atomic>.
It is unspecified whether <stdatomic.h> makes available any declarations in namespace std.
Each of the using-declarations for intN_t, uintN_t, intptr_t, and uintptr_t listed above is defined if and only if the implementation defines the corresponding typedef-name in [atomics.syn].
Neither the _Atomic macro, nor any of the non-macro global namespace declarations, are provided by any C++ standard library header other than <stdatomic.h>.
Recommended practice: Implementations should ensure that C and C++ representations of atomic objects are compatible, so that the same object can be accessed as both an _Atomic(T) from C code and an atomic<T> from C++ code.
The representations should be the same, and the mechanisms used to ensure atomicity and memory ordering should be compatible.

Follow Lee on X/Twitter - Father, Husband, Serial builder creating AI, crypto, games & web tools. We are friends :) AI Will Come To Life!

Check out: eBank.nz (Art Generator) | Netwrck.com (AI Tools) | Text-Generator.io (AI API) | BitBank.nz (Crypto AI) | ReadingTime (Kids Reading) | RewordGame | BigMultiplayerChess | WebFiddle | How.nz | Helix AI Assistant