C++ 参考手册
- C++11
- C++14
- C++17
- C++20
- C++ 编译器支持情况表
- 独立与宿主实现
- C++ 语言
- C++ 关键词
- 预处理器
- C++ 标准库头文件
- 具名要求
- 功能特性测试 (C++20)
- 工具库
- 类型支持(基本类型、RTTI、类型特性)
- 概念库 (C++20)
- 错误处理
- 动态内存管理
- std::unique_ptr
- std::scoped_allocator_adaptor
- std::auto_ptr
- std::destroy_at
- std::destroy
- std::destroy_n
- std::uninitialized_move
- std::uninitialized_value_construct
- std::owner_less
- std::shared_ptr
- std::allocate_shared, std::allocate_shared_for_overwrite
- std::make_shared, std::make_shared_for_overwrite
- std::atomic(std::shared_ptr)
- std::hash(std::shared_ptr)
- std::atomic_...<std::shared_ptr>
- std::addressof
- std::allocator_traits
- std::default_delete
- std::allocator_arg_t
- std::allocator_arg
- std::weak_ptr
- std::enable_shared_from_this
- std::bad_weak_ptr
- std::to_address
- std::assume_aligned
- std::make_obj_using_allocator
- C 内存管理库
- 低层内存管理
- std::pmr::memory_resource
- std::allocator
- std::pointer_traits
- std::uses_allocator
- std::uses_allocator_construction_args
- std::uninitialized_construct_using_allocator
- std::pmr::polymorphic_allocator
- std::pmr::get_default_resource
- std::pmr::set_default_resource
- std::pmr::new_delete_resource
- std::pmr::null_memory_resource
- std::pmr::synchronized_pool_resource
- std::pmr::unsynchronized_pool_resource
- std::pmr::monotonic_buffer_resource
- std::pmr::pool_options
- std::raw_storage_iterator
- std::get_temporary_buffer
- std::return_temporary_buffer
- std::uninitialized_copy
- std::uninitialized_fill
- std::uninitialized_default_construct
- std::uninitialized_copy_n
- std::uninitialized_fill_n
- std::uninitialized_move_n
- std::uninitialized_default_construct_n
- std::uninitialized_value_construct_n
- std::construct_at
- std::align
- 注释
- 日期和时间工具
- 字符串库
- 容器库
- 迭代器库
- 范围库 (C++20)
- 算法库
- 数值库
- 输入/输出库
- 文件系统库
- 本地化库
- 正则表达式库
- 原子操作库
- 线程支持库
- 实验性 C++ 特性
- 有用的资源
- 索引
- std 符号索引
- 协程支持 (C++20)
- C++ 关键词
位置:首页 > C++ 参考手册 >动态内存管理 >std::shared_ptr > std::atomic_...<std::shared_ptr>
std::atomic_...<std::shared_ptr>
template< class T > bool atomic_is_lock_free( const std::shared_ptr<T>* p ); |
(1) | (C++11 起) (C++20 中弃用) |
template< class T > std::shared_ptr<T> atomic_load( const std::shared_ptr<T>* p ); |
(2) | (C++11 起) (C++20 中弃用) |
template< class T > std::shared_ptr<T> atomic_load_explicit( const std::shared_ptr<T>* p, |
(3) | (C++11 起) (C++20 中弃用) |
template< class T > void atomic_store( std::shared_ptr<T>* p, |
(4) | (C++11 起) (C++20 中弃用) |
template< class T > void atomic_store_explicit( std::shared_ptr<T>* p, |
(5) | (C++11 起) (C++20 中弃用) |
template< class T > std::shared_ptr<T> atomic_exchange( std::shared_ptr<T>* p, |
(6) | (C++11 起) (C++20 中弃用) |
template<class T> std::shared_ptr<T> atomic_exchange_explicit( std::shared_ptr<T>* p, |
(7) | (C++11 起) (C++20 中弃用) |
template< class T > bool atomic_compare_exchange_weak( std::shared_ptr<T>* p, |
(8) | (C++11 起) (C++20 中弃用) |
template<class T> bool atomic_compare_exchange_strong( std::shared_ptr<T>* p, |
(9) | (C++11 起) (C++20 中弃用) |
template< class T > bool atomic_compare_exchange_strong_explicit( std::shared_ptr<T>* p, |
(10) | (C++11 起) (C++20 中弃用) |
template< class T > bool atomic_compare_exchange_weak_explicit( std::shared_ptr<T>* p, |
(11) | (C++11 起) (C++20 中弃用) |
若多个执行线程访问同一 std::shared_ptr 对象而无同步,且这些访问中任一者使用 shared_ptr 的非 const 成员函数,则发生数据竞争,除非所有这种访问都通过这些作为对应原子访问函数( std::atomic_load 、 std::atomic_store 等)重载的函数进行。
注意 shared_ptr 的控制块是线程安全的:多个线程能同时用可改操作访问不同的 std::shared_ptr 对象,如 operator= 或 reset ,即使这些实例是副本,并内部共享同一控制块。
p
所指向共享指针的原子访问是否无锁。p
所指向的共享指针。同非特化的 std::atomic_load_explicit , mo
不能是 std::memory_order_release 或 std::memory_order_acq_rel 。r
于 p
所指向的共享指针,等效地执行 p->swap(r) 。同非特化的 std::atomic_store_explicit 、 mo
不能是 std::memory_order_acquire 或 std::memory_order_acq_rel 。r
于 p
所指向的共享指针,并返回 p
先前指向的值。等效地执行 p->swap(r) 并返回交换后 r
的副本。p
所指向的共享指针和 expected
。若它们等价(存储同一指针值,并且共享同一对象的所有权或均为空),则用 success
所指定的内存定序制约赋值 desired
给 *p
并返回 true 。若它们不等价,则用 failure
所指定的内存定序制约赋值 *p
给 *expected
并返回 false 。若 p
为空指针,则这些函数都会引发未定义行为。
参数
p, expected | - | 指向 std::shared_ptr 的指针 |
r, desired | - | 一个 std::shared_ptr |
mo, success, failure | - | std::memory_order 类型的内存定序选择器 |
异常
这些函数不抛异常。
返回值
注意
这些函数典型地以互斥实现,互斥存储于全局哈希表中,其中以指针值为关键。
为避免数据竞争,一旦把共享指针传递给这些函数,就不能非原子地使用它。特别是,若你没有首先把这种 shared_ptr 加载到另一 shared_ptr 对象中,再通过第二对象解引用,就不能解引用它。
并发 TS 提供原子智能指针类 atomic_shared_ptr
和 atomic_weak_ptr
,以替换这些函数的使用。
这些函数被弃用,取代者是 std::atomic 模板的特化: std::atomic<std::shared_ptr> 和 std::atomic<std::weak_ptr> 。 |
(C++20 起) |
示例
本节未完成 原因:暂无示例 |
缺陷报告
下列更改行为的缺陷报告追溯地应用于以前出版的 C++ 标准。
DR | 应用于 | 出版时的行为 | 正确行为 |
---|---|---|---|
LWG 2980 | C++11 | 空的 shared_ptr 决不等价
|
若它们存储同一指针值则等价 |
参阅
(C++11) |
检查对该原子类型的操作是否是无锁的 (函数模板) |
(C++11)(C++11) |
原子地以非原子实参替换原子对象的值 (函数模板) |
(C++11)(C++11) |
原子地获得存储于原子对象的值 (函数模板) |
(C++11)(C++11) |
原子地以非原子实参的值替换原子对象的值,并返回该原子对象的旧值 (函数模板) |
原子地比较原子对象和非原子实参的值,若相等则进行 atomic_exchange,若不相等则进行 atomic_load (函数模板) |