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