命名空间
变体
操作

std::atomic_...<std::shared_ptr>

来自 cppreference.com
< cpp‎ | memory‎ | shared 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 >
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

    ( const std::shared_ptr<T>* p, std::memory_order mo );
(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
    ( std::shared_ptr<T>* p, std::shared_ptr<T> r,

      std::memory_order mo );
(5) (自 C++11 起)
(C++20 中已弃用)
(C++26 中已删除)
template< class T >

std::shared_ptr<T> atomic_exchange

    ( std::shared_ptr<T>* p, std::shared_ptr<T> r );
(6) (自 C++11 起)
(C++20 中已弃用)
(C++26 中已删除)
template< class T >

std::shared_ptr<T> atomic_exchange_explicit
    ( std::shared_ptr<T>* p, std::shared_ptr<T> r,

      std::memory_order mo );
(7) (自 C++11 起)
(C++20 中已弃用)
(C++26 中已删除)
template< class T >

bool atomic_compare_exchange_weak
    ( std::shared_ptr<T>* p, std::shared_ptr<T>* expected,

      std::shared_ptr<T> desired );
(8) (自 C++11 起)
(C++20 中已弃用)
(C++26 中已删除)
template< class T >

bool atomic_compare_exchange_strong
    ( std::shared_ptr<T>* p, std::shared_ptr<T>* expected,

      std::shared_ptr<T> desired );
(9) (自 C++11 起)
(C++20 中已弃用)
(C++26 中已删除)
template< class T >

bool atomic_compare_exchange_strong_explicit
    ( std::shared_ptr<T>* p, std::shared_ptr<T>* expected,
      std::shared_ptr<T> desired,

      std::memory_order success, std::memory_order failure );
(10) (自 C++11 起)
(C++20 中已弃用)
(C++26 中已删除)
template< class T >

bool atomic_compare_exchange_weak_explicit
    ( std::shared_ptr<T>* p, std::shared_ptr<T>* expected,
      std::shared_ptr<T> desired,

      std::memory_order success, std::memory_order failure );
(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)被多个线程同时访问,即使这些实例是副本,并且在内部共享同一个控制块。

1) 确定对 p 指向的共享指针的原子访问是否为无锁的。
2) 等效于 atomic_load_explicit(p, std::memory_order_seq_cst).
3) 返回 p 指向的共享指针。
与非特化 std::atomic_load_explicit 一样,如果 mostd::memory_order_releasestd::memory_order_acq_rel,则行为未定义。
4) 等效于 atomic_store_explicit(p, r, std::memory_order_seq_cst).
5) 将共享指针 r 原子地存储在 p 指向的共享指针中, 就像 p->swap(r) 一样。
与非特化 std::atomic_store_explicit 一样,如果 mostd::memory_order_releasestd::memory_order_acq_rel,则行为未定义。
6) 等效于 atomic_exchange_explicit(p, r, std::memory_order_seq_cst).
7) 将共享指针 r 存储在 p 指向的共享指针中,并返回以前由 p 指向的值,原子地,就像 p->swap(r) 一样,并在交换后返回 r 的副本。
8) 等效于
atomic_compare_exchange_weak_explicit
    (p, expected, desired, std::memory_order_seq_cst,
                           std::memory_order_seq_cst)
.
9) 等效于
atomic_compare_exchange_strong_explicit
    (p, expected, desired, std::memory_order_seq_cst,
                           std::memory_order_seq_cst)
.
10,11) 比较 pexpected 指向的共享指针。
  • 如果它们等效(存储相同的指针值,并且要么共享同一个对象的拥有权,要么都是空的),则使用 success 指定的内存排序约束将 desired 赋值给 *p,并返回 true
  • 如果它们不等效,则使用 failure 指定的内存排序约束将 *p 赋值给 *expected,并返回 false
atomic_compare_exchange_weak_explicit 可能会虚假地失败。
如果 expected 是一个空指针,或者 failurestd::memory_order_releasestd::memory_order_acq_rel,则行为未定义。

如果 p 是一个空指针,则这些函数的行为都是未定义的。

内容

[edit] 参数

p, expected - 一个指向 std::shared_ptr 的指针
r, desired - 一个 std::shared_ptr
mo, success, failure - 类型为 std::memory_order 的内存排序选择器

[edit] 异常

这些函数不抛出异常。

[edit] 返回值

1) true 如果原子访问使用无锁指令实现。
2,3) 指向的共享指针的副本。
4,5) (无)
6,7) 以前指向的共享指针的副本。
8-11) true 如果共享指针等效并且交换已执行,否则为 false

[edit] 注释

这些函数通常使用互斥量实现,存储在一个全局哈希表中,其中指针值用作键。

并发 TS 提供原子智能指针类 atomic_shared_ptratomic_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 起)

[edit] 示例

[edit] 缺陷报告

以下行为更改缺陷报告已追溯应用于先前发布的 C++ 标准。

DR 应用于 发布的行为 正确的行为
LWG 2172 C++11 expected 可以是空指针 在这种情况下,行为未定义
LWG 2980 C++11 空的 shared_ptr 从未等效 如果它们存储相同的指针值,则等效

[edit] 参见

检查原子类型的操作是否为无锁的
(函数模板) [编辑]
原子地将原子对象的数值替换为非原子参数
(函数模板) [编辑]
原子地获取存储在原子对象中的值
(函数模板) [编辑]
原子地将原子对象的数值替换为非原子参数,并返回原子对象的旧值
(函数模板) [编辑]
原子地比较原子对象的数值与非原子参数,如果相等则进行原子交换,否则进行原子加载
(函数模板) [编辑]