Defined in header <atomic> | ||
---|---|---|
template< class T > struct atomic_ref; | (1) | (since C++20) |
template< class T > struct atomic_ref<T*>; | (2) | (since C++20) |
The std::atomic_ref
class template applies atomic operations to the object it references. For the lifetime of the std::atomic_ref
object, the object it references is considered an atomic object. If one thread writes to an atomic object while another thread reads from it, the behavior is well-defined (see memory model for details on data races). In addition, accesses to atomic objects may establish inter-thread synchronization and order non-atomic memory accesses as specified by std::memory_order
.
The lifetime of an object must exceed the lifetime of all std::atomic_ref
s that references the object. While any std::atomic_ref
instance referencing an object exists, the object must be exclusively accessed through these std::atomic_ref
instances. No subobject of an object referenced by an std::atomic_ref
object may be concurrently referenced by any other std::atomic_ref
object.
Atomic operations applied to an object through an std::atomic_ref
are atomic with respect to atomic operations applied through any other std::atomic_ref
referencing the same object.
std::atomic_ref
is CopyConstructible.
Like language references, constness is shallow for std::atomic_ref
- it is possible to modify the referenced value through a const std::atomic_ref
object.
The primary std::atomic_ref
template may be instantiated with any TriviallyCopyable type T
(including bool):
struct Counters { int a; int b; }; // user-defined trivially-copyable type alignas(std::atomic_ref<Counters>::required_alignment) Counters counter; std::atomic_ref<Counters> cnt(counter); // specialization for the user-defined type
The standard library provides partial specializations of the std::atomic_ref
template for all pointer types. In addition to the operations provided for all atomic types, these specializations additionally support atomic arithmetic operations appropriate to pointer types, such as fetch_add
, fetch_sub
.
When instantiated with one of the following integral types, std::atomic_ref
provides additional atomic operations appropriate to integral types such as fetch_add
, fetch_sub
, fetch_and
, fetch_or
, fetch_xor
:
<cstdint>
. Signed integer arithmetic is defined to use two's complement; there are no undefined results.
When instantiated with one of the cv-unqualified floating-point types (float, double, long double and cv-unqualified extended floating-point types (since C++23)), std::atomic_ref
provides additional atomic operations appropriate to floating-point types such as fetch_add
and fetch_sub
.
No operations result in undefined behavior even if the result is not representable in the floating-point type. The floating-point environment in effect may be different from the calling thread's floating-point environment.
Member type | Definition |
---|---|
value_type | see below |
difference_type | value_type (only for atomic_ref<Integral> and atomic_ref<Floating> specializations)std::ptrdiff_t (only for std::atomic_ref<T*> specializations) |
For every std::atomic_ref<X>
(whether or not specialized), std::atomic_ref<X>::value_type
is X
.
difference_type
is not defined in the primary atomic_ref
template.
constructs an atomic_ref object (public member function) |
|
stores a value into the object referenced by an atomic_ref object (public member function) |
|
checks if the atomic_ref object is lock-free (public member function) |
|
atomically replaces the value of the referenced object with a non-atomic argument (public member function) |
|
atomically obtains the value of the referenced object (public member function) |
|
loads a value from the referenced object (public member function) |
|
atomically replaces the value of the referenced object and obtains the value held previously (public member function) |
|
atomically compares the value of the referenced object with non-atomic argument and performs atomic exchange if equal or atomic load if not (public member function) |
|
(C++20) | blocks the thread until notified and the atomic value changes (public member function) |
(C++20) | notifies at least one thread waiting on the atomic object (public member function) |
(C++20) | notifies all threads blocked waiting on the atomic object (public member function) |
Constants |
|
[static] | indicates that the type is always lock-free (public static member constant) |
[static] | indicates the required alignment of an object to be referenced by atomic_ref (public static member constant) |
atomically adds the argument to the value stored in the referenced object and obtains the value held previously (public member function) |
|
atomically subtracts the argument from the value stored in the referenced object and obtains the value held previously (public member function) |
|
atomically performs bitwise AND between the argument and the value of the referenced object and obtains the value held previously (public member function) |
|
atomically performs bitwise OR between the argument and the value of the referenced object and obtains the value held previously (public member function) |
|
atomically performs bitwise XOR between the argument and the value of the referenced object and obtains the value held previously (public member function) |
|
atomically increments or decrements the referenced object by one (public member function) |
|
atomically adds, subtracts, or performs bitwise AND, OR, XOR with the referenced value (public member function) |
Feature-test macro | Value | Std | Comment |
---|---|---|---|
__cpp_lib_atomic_ref | 201806L | (C++20) |
std::atomic_ref |
(C++11) | atomic class template and specializations for bool, integral, and pointer types (class template) |
© cppreference.com
Licensed under the Creative Commons Attribution-ShareAlike Unported License v3.0.
https://en.cppreference.com/w/cpp/atomic/atomic_ref