|
| |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| 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] |