Files
cppdraft_translate/cppdraft/depr/atomics.md
2025-10-25 03:02:53 +03:00

4.5 KiB
Raw Blame History

[depr.atomics]

Annex D (normative) Compatibility features [depr]

D.23 Deprecated atomic operations [depr.atomics]

D.23.1 General [depr.atomics.general]

1

#

The header has the following additions.

namespace std {templatevoid atomic_init(volatile atomic, typename atomic::value_type) noexcept; templatevoid atomic_init(atomic, typename atomic::value_type) noexcept; templateconstexpr T kill_dependency(T y) noexcept; // freestandinginline constexpr memory_order memory_order_consume = memory_order::consume; // freestanding#define ATOMIC_VAR_INIT(value) see below}

D.23.2 Volatile access [depr.atomics.volatile]

1

#

If an atomic ([atomics.types.generic]) specialization has one of the following overloads, then that overload participates in overload resolution even if atomic::is_always_lock_free is false:void store(T desired, memory_order order = memory_order::seq_cst) volatile noexcept; T operator=(T desired) volatile noexcept; T load(memory_order order = memory_order::seq_cst) const volatile noexcept;operator T() const volatile noexcept; T exchange(T desired, memory_order order = memory_order::seq_cst) volatile noexcept;bool compare_exchange_weak(T& expected, T desired, memory_order success, memory_order failure) volatile noexcept;bool compare_exchange_strong(T& expected, T desired, memory_order success, memory_order failure) volatile noexcept;bool compare_exchange_weak(T& expected, T desired, memory_order order = memory_order::seq_cst) volatile noexcept;bool compare_exchange_strong(T& expected, T desired, memory_order order = memory_order::seq_cst) volatile noexcept; T fetch_key(T operand, memory_order order = memory_order::seq_cst) volatile noexcept; T operator op=(T operand) volatile noexcept; T* fetch_key(ptrdiff_t operand, memory_order order = memory_order::seq_cst) volatile noexcept;

D.23.3 Non-member functions [depr.atomics.nonmembers]

🔗

template<class T> void atomic_init(volatile atomic<T>* object, typename atomic<T>::value_type desired) noexcept; template<class T> void atomic_init(atomic<T>* object, typename atomic<T>::value_type desired) noexcept;

1

#

Effects: Equivalent to: atomic_store_explicit(object, desired, memory_order::relaxed);

D.23.4 Operations on atomic types [depr.atomics.types.operations]

🔗

#define ATOMIC_VAR_INIT(value) see below

1

#

The macro expands to a token sequence suitable for constant initialization of an atomic variable with static storage duration of a type that is initialization-compatible with value.

[Note 1:

This operation possibly needs to initialize locks.

— end note]

Concurrent access to the variable being initialized, even via an atomic operation, constitutes a data race.

[Example 1: atomic v = ATOMIC_VAR_INIT(5); — end example]

D.23.5 memory_order::consume [depr.atomics.order]

1

#

The memory_order enumeration contains an additional enumerator:consume = 1

The memory_order::consume enumerator is allowed wherevermemory_order::acquire is allowed, and it has the same meaning.

🔗

template<class T> constexpr T kill_dependency(T y) noexcept;

2

#

Returns: y.