std::atomic(std::weak_ptr)
template <class T> struct std::atomic<std::weak_ptr<T>>; |
(C++20 起) | |
std::atomic 对 std::weak_ptr<T> 的部分模板特化允许用户原子地操纵 weak_ptr 。
若多个执行线程访问同一 std::weak_ptr 对象而不同步,而任何这些访问使用 weak_ptr 的非 const 成员函数,则将出现数据竞争,除非所有这种访问都通过 std::atomic<std::weak_ptr>> 的实例进行。
保证关联 use_count 的自增是原子操作的一部分。要求关联 use_count 的自减在原子操作之后,但不要求是其一部分,除非在覆写失败的 CAS 中的 expected
时 use_count 更改。任何关联删除和解分配后序于原子更新步骤,且不是原子操作的一部分。
注意 std::weak_ptr 和 std::shared_ptr 所用的控制块是线程安全的:多个线程能同时用可变操作,例如 operator= 或 reset ,访问不同的非原子 std::weak_ptr 对象,即使在这些实例互为副本,或因其他原因于内部共享同一控制块时。
类型 T 可为不完整类型。
成员类型
成员类型 | 定义 |
value_type
|
std::weak_ptr<T> |
成员函数
此特化亦提供所有非特化 std::atomic 的成员函数,且不提供额外成员函数。
atomic<weak_ptr<T>>::atomic
constexpr atomic() noexcept = default; |
(1) | |
atomic(std::weak_ptr<T> desired) noexcept; |
(2) | |
atomic(const atomic&) = delete; |
(3) | |
weak_ptr<T>
为默认构造值。atomic<weak_ptr<T>>::operator=
void operator=(const atomic&) = delete; |
(1) | |
void operator=(std::weak_ptr<T> desired) noexcept; |
(2) | |
atomic<weak_ptr<T>>::is_lock_free
bool is_lock_free() const noexcept; |
||
若此类型所有对象上的原子操作为无锁则返回 true ,否则返回 false 。
atomic<weak_ptr<T>>::store
void store(std::weak_ptr<T> desired, std::memory_order order = std::memory_order_seq_cst) noexcept; |
||
如同用 p.swap(desired) ,原子地以 desired
的值替换 *this 的值,其中 p 为底层的 std::weak_ptr<T> 。按照 order
排序内存。若 order
非 std::memory_order_consume 、 std::memory_order_acquire 或 std::memory_order_acq_rel 则行为未定义。
atomic<weak_ptr<T>>::load
std::weak_ptr<T> load(std::memory_order order = std::memory_order_seq_cst) const noexcept; |
||
原子地返回底层 std::weak_ptr<T> 的副本。按照 order
排序内存。若 order
非 std::memory_order_release 或 std::memory_order_acq_rel 则行为未定义。
atomic<weak_ptr<T>>::operator std::weak_ptr<T>
operator std::weak_ptr<T>() const noexcept; |
||
等价于 return load(); 。
atomic<weak_ptr<T>>::exchange
std::weak_ptr<T> exchange(std::weak_ptr<T> desired, std::memory_order order = std::memory_order_seq_cst) noexcept; |
||
如同用 p.swap(desired) ,原子地以 desired
替换底层 std::weak_ptr<T> ,其中 p 为底层 std::weak_ptr<T> ,并返回 p 立即在交换前所拥有的值的副本。按照 order
排序内存。操作是原子读修改写操作。
atomic<weak_ptr<T>>::compare_exchange_weak, compare_exchange_strong
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
相同的指针,并与之共享所有权,或若底层指针和 expected
均为空,则从 desired
赋值给底层 std::weak_ptr<T> 并返回 true ,按照 success
排序内存;否则从底层 std::weak_ptr<T> 赋值给 expected
并返回 false ,按照 failure
排序内存。若 failure
为 std::memory_order_release 或 std::memory_order_acq_rel 则行为未定义。成功时,操作为 *this 上的原子读修改写操作,而在原子更新后不访问 expected
。失败时,操作是 *this 上的原子加载操作,并以读取自原子对象的既存值更新 expected
。这个对 expected
的 use_count 的更新是原子操作,尽管不要求写入自身(和任何后继的解分配/析构)是。fail_order
与 order
相同,除了 std:memory_order_acq_rel 被替换为 std::memory_order_acquire ,而 std::memory_order_release 被替换为 std::memory_order_relaxed 。fail_order
与 order
相同,除了 std::memory_order_acq_rel 被替换为 std::memory_order_acquire ,而 std::memory_order_release 被替换为 std::memory_order_relaxed 。
成员常量
此特化亦提供唯一的标准 std::atomic 成员常量 is_always_lock_free
。
atomic<weak_ptr<T>>::is_always_lock_free
static constexpr bool is_always_lock_free = /*implementation-defined*/; |
||
示例
本节未完成 原因:暂无示例 |
参阅
(C++11) |
atomic 类模板及其针对布尔、整型和指针类型的特化 (类模板) |