The partial template specialization of std::atomic for std::weak_ptr<T> allows users to manipulate weak_ptr objects atomically.
If multiple threads of execution access the same std::weak_ptr object without synchronization and any of those accesses uses a non-const member function of weak_ptr then a data race will occur unless all such access is performed through an instance of std::atomic<std::weak_ptr>.
Associated use_count
increments are guaranteed to be part of the atomic operation. Associated use_count
decrements are sequenced after the atomic operation, but are not required to be part of it, except for the use_count
change when overriding expected
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 by std::weak_ptr and std::shared_ptr is thread-safe: different non-atomic std::weak_ptr objects can be accessed using mutable operations, such as operator= or reset
, simultaneously by multiple threads, even when these instances are copies or otherwise share the same control block internally.
The type T
may be an incomplete type.
All non-specialized std::atomic functions are also provided by this specialization, and no additional member functions.
atomic<weak_ptr<T>>::atomicconstexpr atomic() noexcept = default;
(1) (2)atomic(const atomic&) = delete;
(3)1) Initializes the underlying weak_ptr<T>
to default-constructed value.
Initializes the underlying
weak_ptr<T>
to a copy of
desired
. As with any
std::atomictype, initialization is not an atomic operation.
3) Atomic types are not copy/move constructible.
atomic<weak_ptr<T>>::operator=void operator=(const atomic&) = delete;
(1) (2)1) Atomic types are not copy/move assignable.
2) Value assignment, equivalent to store(desired).
atomic<weak_ptr<T>>::is_lock_freebool is_lock_free() const noexcept;
Returns true if the atomic operations on all objects of this type are lock-free, false otherwise.
atomic<weak_ptr<T>>::operator std::weak_ptr<T>Equivalent to return load();.
atomic<weak_ptr<T>>::exchangeAtomically replaces the underlying std::weak_ptr<T> with desired
as if by p.swap(desired) where p is the underlying std::weak_ptr<T>, and returns a copy of the value that p had immediately before the swap. Memory is ordered according to order
. This is an atomic read-modify-write operation.
If the underlying
std::weak_ptr<T>stores the same pointer value as
expected
and shares ownership with it, or if both underlying and
expected
are empty, assigns from
desired
to the underlying
std::weak_ptr<T>, returns
true, and orders memory according to
success
, otherwise assigns from the underlying
std::weak_ptr<T>to
expected
, returns
false, and orders memory according to
failure
. The behavior is undefined if
failure
is
std::memory_order_releaseor
std::memory_order_acq_rel. On success, the operation is an atomic read-modify-write operation on
*thisand
expected
is not accessed after the atomic update. On failure, the operation is an atomic load operation on
*thisand
expected
is updated with the existing value read from the atomic object. This update to
expected
's use_count is part of this atomic operation, although the write itself (and any subsequent deallocation/destruction) is not required to be.
2) Same as (1), but may also fail spuriously.
atomic<weak_ptr<T>>::waitPerforms an atomic waiting operation.
Compares load(order) with old
and if they are equivalent then blocks until *this is notified by notify_one()
or notify_all()
. This is repeated until load(order) changes. This function is guaranteed to return only if value has changed, even if underlying implementation unblocks spuriously.
Memory is ordered according to order
. The behavior is undefined if order
is std::memory_order_release or std::memory_order_acq_rel.
Notes: two std::weak_ptrs are equivalent if they store the same pointer and either share ownership or are both empty.
atomic<weak_ptr<T>>::notify_onevoid 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 standard std::atomic member constant is_always_lock_free
is also provided by this specialization.
static constexpr bool is_always_lock_free = /*implementation-defined*/;
[edit] Example [edit] See also atomic class template and specializations for bool, integral, floating-point,(since C++20) and pointer typesRetroSearch is an open source project built by @garambo | Open a GitHub Issue
Search and Browse the WWW like it's 1997 | Search results from DuckDuckGo
HTML:
3.2
| Encoding:
UTF-8
| Version:
0.7.4