命名空间
变体
操作

std::atomic<std::weak_ptr>

来自 cppreference.com
< cpp‎ | memory‎ | weak ptr
 
 
实用程序库
语言支持
类型支持 (基本类型,RTTI)
库功能测试宏 (C++20)
动态内存管理
程序实用程序
协程支持 (C++20)
可变参数函数
调试支持
(C++26)
三方比较
(C++20)
(C++20)(C++20)(C++20)
(C++20)(C++20)(C++20)
通用实用程序
日期和时间
函数对象
格式化库 (C++20)
(C++11)
关系运算符 (C++20 中已弃用)
整数比较函数
(C++20)(C++20)(C++20)   
(C++20)
交换类型操作
(C++14)
(C++11)
(C++11)
(C++11)
(C++17)
通用词汇类型
(C++11)
(C++17)
(C++17)
(C++17)
(C++11)
(C++17)
(C++23)
基本字符串转换
(C++17)
(C++17)

 
动态内存管理
未初始化内存算法
受约束的未初始化内存算法
分配器
垃圾收集支持
(C++11)(直到 C++23)
(C++11)(直到 C++23)
(C++11)(直到 C++23)
(C++11)(直到 C++23)
(C++11)(直到 C++23)
(C++11)(直到 C++23)



 
 
定义在头文件 <memory>
template< class T > struct std::atomic<std::weak_ptr<T>>;
(自 C++20 起)

对于 std::weak_ptr<T>std::atomic 的部分模板特化允许用户以原子方式操作 weak_ptr 对象。

如果多个执行线程在没有同步的情况下访问同一个 std::weak_ptr 对象,并且任何这些访问都使用 weak_ptr 的非 const 成员函数,那么除非所有这些访问都是通过 std::atomic<std::weak_ptr> 的实例执行的,否则将发生数据竞争。

关联的 use_count 增量保证是原子操作的一部分。关联的 use_count 减量按顺序排在原子操作之后,但不需要是原子操作的一部分,除了在失败的 CAS 中覆盖 expected 时发生的 use_count 变化。任何关联的删除和释放按顺序排在原子更新步骤之后,并且不是原子操作的一部分。

请注意,std::weak_ptrstd::shared_ptr 使用的控制块是线程安全的:不同的非原子 std::weak_ptr 对象可以使用可变操作(例如 operator=reset)被多个线程同时访问,即使这些实例是副本或以其他方式在内部共享同一个控制块。

类型 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)
1) 将底层 weak_ptr<T> 初始化为默认构造的值。
2) 将底层 weak_ptr<T> 初始化为 desired 的副本。与任何 std::atomic 类型一样,初始化不是原子操作。
3) 原子类型不可复制/移动构造。

atomic<weak_ptr<T>>::operator=

void operator=(const atomic&) = delete;
(1)
void operator=(std::weak_ptr<T> desired) noexcept;
(2)
1) 原子类型不可复制/移动赋值。
2) 值赋值,等效于 store(desired).

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;

原子地用 desired 的值替换 *this 的值,就好像通过 p.swap(desired) 一样,其中 p 是底层的 std::weak_ptr<T>。内存根据 order 进行排序。如果 orderstd::memory_order_consumestd::memory_order_acquirestd::memory_order_acq_rel,则行为未定义。

atomic<weak_ptr<T>>::load

原子地返回底层 std::weak_ptr<T> 的副本。内存根据 order 进行排序。如果 orderstd::memory_order_releasestd::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;

std::memory_order order = std::memory_order_seq_cst) noexcept;

原子地用 desired 替换底层的 std::weak_ptr<T>,就好像通过 p.swap(desired) 一样,其中 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,
(1)
std::memory_order success, std::memory_order failure) noexcept;
                           bool compare_exchange_strong(std::weak_ptr<T>& expected, std::weak_ptr<T> desired,
(2)
atomic<weak_ptr<T>>::compare_exchange_weak, compare_exchange_strong
                             std::memory_order order = std::memory_order_seq_cst) noexcept;
(3)
std::memory_order success, std::memory_order failure) noexcept;
                           std::memory_order order = std::memory_order_seq_cst) noexcept;
(4)
bool compare_exchange_weak(std::weak_ptr<T>& expected, std::weak_ptr<T> desired,
1) 如果底层的 std::weak_ptr<T> 存储与 expected 相同的指针值,并且与它共享所有权,或者如果底层和 expected 都是空的,则从 desired 赋值给底层的 std::weak_ptr<T>,返回 true,并根据 success 对内存进行排序,否则从底层的 std::weak_ptr<T> 赋值给 expected,返回 false,并根据 failure 对内存进行排序。如果 failurestd::memory_order_releasestd::memory_order_acq_rel,则行为未定义。如果成功,则操作是 *this 上的原子读-修改-写操作,并且 expected 在原子更新后不会被访问。如果失败,则操作是 *this 上的原子加载操作,并且 expected 会使用从原子对象读取的现有值进行更新。对 expected 的 use_count 的此更新是此原子操作的一部分,尽管该写入本身(以及任何后续的释放/销毁)不需要是。
2)(1) 相同,但还可能随机失败。
3) 等效于: return compare_exchange_strong(expected, desired, order, fail_order);,其中 fail_orderorder 相同,不同之处在于 std::memory_order_acq_relstd::memory_order_acquire 替换,std::memory_order_releasestd::memory_order_relaxed 替换。

4) 等效于: return compare_exchange_weak(expected, desired, order, fail_order);,其中 fail_orderorder 相同,不同之处在于 std::memory_order_acq_relstd::memory_order_acquire 替换,std::memory_order_releasestd::memory_order_relaxed 替换。

atomic<weak_ptr<T>>::wait
          void wait(std::weak_ptr<T> old

std::memory_order order = std::memory_order_seq_cst) const noexcept;

执行原子等待操作。

load(order)old 进行比较,如果它们等效,则阻塞,直到 *thisnotify_one()notify_all() 通知。这会一直重复,直到 load(order) 发生变化。即使底层实现随机解除阻塞,此函数也保证只有在值发生变化时才会返回。

内存根据 order 进行排序。如果 orderstd::memory_order_releasestd::memory_order_acq_rel,则行为未定义。

注意:如果两个 std::weak_ptr 存储相同的指针,并且它们要么共享所有权,要么都为空,则它们等效。

atomic<weak_ptr<T>>::notify_one

void notify_one() noexcept;

执行原子通知操作。

如果有一个线程被阻塞在 *this 上的原子等待操作(即 wait())中,则解除阻塞至少一个这样的线程;否则不做任何操作。

atomic<weak_ptr<T>>::notify_all

void notify_one() noexcept;

void notify_all() noexcept;

[编辑] 成员常量

此特化也提供唯一的标准 std::atomic 成员常量 is_always_lock_free

atomic<weak_ptr<T>>::is_always_lock_free

static constexpr bool is_always_lock_free = /*实现定义*/;

[编辑] 例子

[编辑] 参见

(C++11)
针对 bool、整数、浮点数,(自 C++20 起) 和指针类型的原子类模板和特化
(类模板) [编辑]