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

100 lines
4.5 KiB
Markdown
Raw Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

[depr.atomics]
# Annex D (normative) Compatibility features [[depr]](./#depr)
## D.23 Deprecated atomic operations [depr.atomics]
### [D.23.1](#general) General [[depr.atomics.general]](depr.atomics.general)
[1](#general-1)
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/future.tex#L912)
The header [<atomic>](atomics.syn#header:%3catomic%3e "32.5.2Header <atomic> synopsis[atomics.syn]") has the following additions[.](#general-1.sentence-1)
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; template<class T>constexpr 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) Volatile access [[depr.atomics.volatile]](depr.atomics.volatile)
[1](#volatile-1)
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/future.tex#L930)
If an atomic ([[atomics.types.generic]](atomics.types.generic "32.5.8Class template atomic")) specialization has one of the following overloads,
then that overload participates in overload resolution
even if atomic<T>::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](#nonmembers) Non-member functions [[depr.atomics.nonmembers]](depr.atomics.nonmembers)
[🔗](#lib:atomic_init)
`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](#nonmembers-1)
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/future.tex#L964)
*Effects*: Equivalent to: atomic_store_explicit(object, desired, memory_order::relaxed);
### [D.23.4](#types.operations) Operations on atomic types [[depr.atomics.types.operations]](depr.atomics.types.operations)
[🔗](#lib:ATOMIC_VAR_INIT_)
`#define ATOMIC_VAR_INIT(value) see below
`
[1](#types.operations-1)
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/future.tex#L977)
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[.](#types.operations-1.sentence-1)
[*Note [1](#types.operations-note-1)*:
This operation possibly needs to initialize locks[.](#types.operations-1.sentence-2)
— *end note*]
Concurrent access to the variable being initialized,
even via an atomic operation,
constitutes a data race[.](#types.operations-1.sentence-3)
[*Example [1](#types.operations-example-1)*: atomic<int> v = ATOMIC_VAR_INIT(5); — *end example*]
### [D.23.5](#order) memory_order::consume [[depr.atomics.order]](depr.atomics.order)
[1](#order-1)
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/future.tex#L998)
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[.](#order-1.sentence-2)
[🔗](#order-itemdecl:1)
`template<class T> constexpr T kill_dependency(T y) noexcept;
`
[2](#order-2)
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/future.tex#L1011)
*Returns*: y[.](#order-2.sentence-1)