std::atomic_...<std::shared_ptr>
在标头 <memory> 定义
|
||
template< class T > bool atomic_is_lock_free( const std::shared_ptr<T>* p ); |
(1) | (C++11 起) (C++20 中弃用) (C++26 中移除) |
template< class T > std::shared_ptr<T> atomic_load( const std::shared_ptr<T>* p ); |
(2) | (C++11 起) (C++20 中弃用) (C++26 中移除) |
template< class T > std::shared_ptr<T> atomic_load_explicit |
(3) | (C++11 起) (C++20 中弃用) (C++26 中移除) |
template< class T > void atomic_store( std::shared_ptr<T>* p, std::shared_ptr<T> r ); |
(4) | (C++11 起) (C++20 中弃用) (C++26 中移除) |
template< class T > void atomic_store_explicit |
(5) | (C++11 起) (C++20 中弃用) (C++26 中移除) |
template< class T > std::shared_ptr<T> atomic_exchange |
(6) | (C++11 起) (C++20 中弃用) (C++26 中移除) |
template< class T > std::shared_ptr<T> atomic_exchange_explicit |
(7) | (C++11 起) (C++20 中弃用) (C++26 中移除) |
template< class T > bool atomic_compare_exchange_weak |
(8) | (C++11 起) (C++20 中弃用) (C++26 中移除) |
template< class T > bool atomic_compare_exchange_strong |
(9) | (C++11 起) (C++20 中弃用) (C++26 中移除) |
template< class T > bool atomic_compare_exchange_strong_explicit |
(10) | (C++11 起) (C++20 中弃用) (C++26 中移除) |
template< class T > bool atomic_compare_exchange_weak_explicit |
(11) | (C++11 起) (C++20 中弃用) (C++26 中移除) |
如果多个执行线程无同步地访问同一 std::shared_ptr 对象,而其中由任何访问使用了 shared_ptr 的非 const 成员函数,那么就会发生数据竞争,除非所有这种访问都通过这些作为对应原子访问函数(std::atomic_load、std::atomic_store 等)重载的函数进行。
注意 shared_ptr
的控制块是线程安全的:多个线程能同时用可改操作访问不同的 std::shared_ptr 对象,如 operator= 或 reset
,即使这些实例都是副本,并内部共享同一控制块也是如此。
(p, expected, desired, std::memory_order_seq_cst,
std::memory_order_seq_cst)。
(p, expected, desired, std::memory_order_seq_cst,
std::memory_order_seq_cst)。
- 如果它们等价(存储同一指针值,共享同一对象的所有权或均为空),那么用 success 指定的内存定序制约将 desired 赋给 *p 并返回 true。
- 如果它们不等价,那么用 failure 指定的内存定序制约将 *p 赋给 *expected 并返回 false。
atomic_compare_exchange_weak_explicit
可能会虚假地失败。如果 p 是空指针,那么这些函数的行为均未定义。
参数
p, expected | - | 指向 std::shared_ptr 的指针 |
r, desired | - | 一个 std::shared_ptr |
mo, success, failure | - | std::memory_order 类型的内存定序选择符 |
异常
这些函数不会抛出异常。
返回值
注解
这些函数典型地利用互斥体实现,互斥体存储于一个全局散列表中,其中以指针值为键。
并发 TS 提供原子智能指针类 atomic_shared_ptr
和 atomic_weak_ptr
作为使用这些函数的替代品。
这些函数被弃用,取代者是 std::atomic 模板的特化:std::atomic<std::shared_ptr> 和 std::atomic<std::weak_ptr>。 |
(C++20 起) (C++26 前) |
这些函数被删除,取代者是 std::atomic 模板的特化:std::atomic<std::shared_ptr> 和 std::atomic<std::weak_ptr>。 |
(C++26 起) |
示例
本节未完成 原因:暂无示例 |
缺陷报告
下列更改行为的缺陷报告追溯地应用于以前出版的 C++ 标准。
缺陷报告 | 应用于 | 出版时的行为 | 正确行为 |
---|---|---|---|
LWG 2980 | C++11 | 空的 shared_ptr 决不等价
|
在它们存储同一指针值的情况下等价 |
参阅
(C++11) |
检查该原子类型的操作是否是免锁的 (函数模板) |
(C++11)(C++11) |
原子地以非原子实参替换原子对象的值 (函数模板) |
(C++11)(C++11) |
原子地获得存储于原子对象的值 (函数模板) |
(C++11)(C++11) |
原子地以非原子实参的值替换原子对象的值,并返回该原子对象的旧值 (函数模板) |
原子地比较原子对象和非原子实参的值,相等时进行原子交换,不相等时进行原子加载 (函数模板) |