Namespaces
Variants

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

From cppreference.net
Memory management library
( exposition only* )
Allocators
Uninitialized memory algorithms
Constrained uninitialized memory algorithms
Memory resources
Uninitialized storage (until C++20)
( until C++20* )
( until C++20* )
( until C++20* )

Garbage collector support (until C++23)
(C++11) (until C++23)
(C++11) (until C++23)
(C++11) (until C++23)
(C++11) (until C++23)
(C++11) (until C++23)
(C++11) (until 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 &lt

如果多个执行线程在未同步的情况下访问同一个 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 指向的 shared pointer。
与非特化版本的 std::atomic_load_explicit 相同,若 mo std:: memory_order_release std:: 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 相同,若 mo std:: memory_order_acquire std:: 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) 比较由 p expected 指向的共享指针。
  • 若它们等价(存储相同指针值,且同时共享同一对象所有权或均为空),则使用 success 指定的内存顺序约束将 desired 赋值给 * p 并返回 true
  • 若它们不等价,则使用 failure 指定的内存顺序约束将 * p 赋值给 * expected 并返回 false
atomic_compare_exchange_weak_explicit 可能虚假失败。
expected 为空指针,或 failure std:: memory_order_release std:: memory_order_acq_rel ,则行为未定义。

如果 p 是空指针,这些函数的行为均未定义。

目录

参数

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

异常

这些函数不会抛出异常。

返回值

1) true 如果原子访问是通过无锁指令实现的。
2,3) 指向的共享指针的副本。
4,5) (无)
6,7) 先前指向的共享指针的副本。
8-11) true 若共享指针等价且交换已执行, false 否则。

注释

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

Concurrency TS 提供了原子智能指针类 atomic_shared_ptr atomic_weak_ptr ,作为这些函数使用的替代方案。

这些函数已被弃用,推荐使用 std:: atomic < std:: shared_ptr > std:: atomic < std:: weak_ptr > 模板特化版本替代。

(since C++20)
(until C++26)

这些函数已被移除,推荐使用 std:: atomic < std:: shared_ptr > std:: atomic < std:: weak_ptr > 模板特化版本替代。

(since C++26)

示例

缺陷报告

下列行为变更缺陷报告被追溯应用于先前发布的 C++ 标准。

缺陷报告 适用标准 发布时行为 正确行为
LWG 2172 C++11 expected 可能为空指针 此情况下行为未定义
LWG 2980 C++11 shared_ptr 始终不等价 存储相同指针值时等价

参见

检查原子类型的操作是否无锁
(函数模板)
以原子方式用非原子参数替换原子对象的值
(函数模板)
以原子方式获取存储在原子对象中的值
(函数模板)
以原子方式用非原子参数替换原子对象的值并返回原子的旧值
(函数模板)
以原子方式比较原子对象的值与非原子参数,若相等则执行原子交换,否则执行原子加载
(函数模板)