|
|
Member functions | ||||
Modifiers | ||||
Observers | ||||
(C++26) | ||||
(C++26) | ||||
Non-member functions | ||||
Helper classes | ||||
atomic<std::weak_ptr> (C++20) | ||||
Deduction guides(C++17) |
Defined in header <memory> | ||
template<class T>structstd::atomic<std::weak_ptr<T>>; | (since C++20) | |
The partial template specialization ofstd::atomic forstd::weak_ptr<T> allows users to manipulate weak_ptr objects atomically.
If multiple threads of execution access the samestd::weak_ptr object without synchronization and any of those accesses uses a non-const member function ofweak_ptr then a data race will occur unless all such access is performed through an instance ofstd::atomic<std::weak_ptr>.
Associateduse_count
increments are guaranteed to be part of the atomic operation. Associateduse_count
decrements are sequenced after the atomic operation, but are not required to be part of it, except for theuse_count
change when overridingexpected
in a failed CAS. Any associated deletion and deallocation are sequenced after the atomic update step and are not part of the atomic operation.
Note that the control block used bystd::weak_ptr andstd::shared_ptr is thread-safe: different non-atomicstd::weak_ptr objects can be accessed using mutable operations, such asoperator= orreset
, simultaneously by multiple threads, even when these instances are copies or otherwise share the same control block internally.
The typeT
may be an incomplete type.
Member type | Definition |
value_type | std::weak_ptr<T> |
All non-specializedstd::atomic functions are also provided by this specialization, and no additional member functions.
constexpr atomic()noexcept=default; | (1) | |
atomic(std::weak_ptr<T> desired)noexcept; | (2) | |
atomic(const atomic&)= delete; | (3) | |
weak_ptr<T>
to default-constructed value.weak_ptr<T>
to a copy ofdesired
. As with anystd::atomic type, initialization is not an atomic operation.void operator=(const atomic&)= delete; | (1) | |
void operator=(std::weak_ptr<T> desired)noexcept; | (2) | |
bool is_lock_free()constnoexcept; | ||
Returns true if the atomic operations on all objects of this type are lock-free, false otherwise.
void store(std::weak_ptr<T> desired, std::memory_order order=std::memory_order_seq_cst)noexcept; | ||
Atomically replaces the value of*this with the value ofdesired
as if byp.swap(desired) wherep is the underlyingstd::weak_ptr<T>. Memory is ordered according toorder
. The behavior is undefined iforder
isstd::memory_order_consume,std::memory_order_acquire, orstd::memory_order_acq_rel.
std::weak_ptr<T> load(std::memory_order order=std::memory_order_seq_cst)constnoexcept; | ||
Atomically returns a copy of the underlyingstd::weak_ptr<T>. Memory is ordered according toorder
. The behavior is undefined iforder
isstd::memory_order_release orstd::memory_order_acq_rel.
operatorstd::weak_ptr<T>()constnoexcept; | ||
Equivalent toreturn load();.
std::weak_ptr<T> exchange(std::weak_ptr<T> desired, std::memory_order order=std::memory_order_seq_cst)noexcept; | ||
Atomically replaces the underlyingstd::weak_ptr<T> withdesired
as if byp.swap(desired) wherep is the underlyingstd::weak_ptr<T>, and returns a copy of the value thatp had immediately before the swap. Memory is ordered according toorder
. This is an atomic read-modify-write operation.
bool compare_exchange_strong(std::weak_ptr<T>& expected,std::weak_ptr<T> desired, std::memory_order success,std::memory_order failure)noexcept; | (1) | |
bool compare_exchange_weak(std::weak_ptr<T>& expected,std::weak_ptr<T> desired, std::memory_order success,std::memory_order failure)noexcept; | (2) | |
bool compare_exchange_strong(std::weak_ptr<T>& expected,std::weak_ptr<T> desired, std::memory_order order=std::memory_order_seq_cst)noexcept; | (3) | |
bool compare_exchange_weak(std::weak_ptr<T>& expected,std::weak_ptr<T> desired, std::memory_order order=std::memory_order_seq_cst)noexcept; | (4) | |
expected
and shares ownership with it, or if both underlying andexpected
are empty, assigns fromdesired
to the underlyingstd::weak_ptr<T>, returnstrue, and orders memory according tosuccess
, otherwise assigns from the underlyingstd::weak_ptr<T> toexpected
, returnsfalse, and orders memory according tofailure
. The behavior is undefined iffailure
isstd::memory_order_release orstd::memory_order_acq_rel. On success, the operation is an atomic read-modify-write operation on*this andexpected
is not accessed after the atomic update. On failure, the operation is an atomic load operation on*this andexpected
is updated with the existing value read from the atomic object. This update toexpected
's use_count is part of this atomic operation, although the write itself (and any subsequent deallocation/destruction) is not required to be.fail_order
is the same asorder
except thatstd::memory_order_acq_rel is replaced bystd::memory_order_acquire andstd::memory_order_release is replaced bystd::memory_order_relaxed.fail_order
is the same asorder
except thatstd::memory_order_acq_rel is replaced bystd::memory_order_acquire andstd::memory_order_release is replaced bystd::memory_order_relaxed.void wait(std::weak_ptr<T> old std::memory_order order=std::memory_order_seq_cst)constnoexcept; | ||
Performs an atomic waiting operation.
Comparesload(order) withold
and if they are equivalent then blocks until*this is notified bynotify_one()
ornotify_all()
. This is repeated untilload(order) changes. This function is guaranteed to return only if value has changed, even if underlying implementation unblocks spuriously.
Memory is ordered according toorder
. The behavior is undefined iforder
isstd::memory_order_release orstd::memory_order_acq_rel.
Notes: twostd::weak_ptrs are equivalent if they store the same pointer and either share ownership or are both empty.
void notify_one()noexcept; | ||
Performs an atomic notifying operation.
If there is a thread blocked in atomic waiting operations (i.e.wait()
) on*this, then unblocks at least one such thread; otherwise does nothing.
void notify_all()noexcept; | ||
Performs an atomic notifying operation.
Unblocks all threads blocked in atomic waiting operations (i.e.wait()
) on*this, if there are any; otherwise does nothing.
The only standardstd::atomic member constantis_always_lock_free
is also provided by this specialization.
staticconstexprbool is_always_lock_free=/*implementation-defined*/; | ||
This section is incomplete Reason: no example |
(C++11) | atomic class template and specializations for bool, integral, floating-point,(since C++20) and pointer types (class template)[edit] |