Namespaces
Variants

std::experimental::atomic_shared_ptr<T>:: compare_exchange_strong, std::experimental::atomic_shared_ptr<T>:: compare_exchange_weak

From cppreference.net
bool compare_exchange_weak ( std:: shared_ptr < T > & expected, const 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_weak ( std:: shared_ptr < T > & expected, const 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)
bool compare_exchange_strong ( std:: shared_ptr < T > & expected, const std:: shared_ptr < T > & desired,
std:: memory_order success, std:: memory_order failure ) noexcept ;
(5)
bool compare_exchange_strong ( std:: shared_ptr < T > & expected, std:: shared_ptr < T > && desired,
std:: memory_order success, std:: memory_order failure ) noexcept ;
(6)
bool compare_exchange_strong ( std:: shared_ptr < T > & expected, const std:: shared_ptr < T > & desired,
std:: memory_order order = std:: memory_order_seq_cst ) noexcept ;
(7)
bool compare_exchange_strong ( std:: shared_ptr < T > & expected, std:: shared_ptr < T > && desired,
std:: memory_order order = std:: memory_order_seq_cst ) noexcept ;
(8)

原子地比较 * this 中的底层 shared_ptr expected ,若二者等价,则用 desired 替换前者(执行读-修改-写操作)。否则,将 * this 中存储的实际值加载到 expected 中(执行加载操作)。此替换操作通过 shared_ptr 的拷贝或移动赋值运算符按需执行。

两个 shared_ptr 当且仅当存储相同指针值且共享所有权时是等价的。

读-修改-写操作与加载操作的内存模型分别为 success failure 。对于重载版本 (3,4,7,8) order 会同时用于读-修改-写和加载操作,但若 order == std:: memory_order_acq_rel ,则加载操作会使用 std::memory_order_acquire ;若 order == std:: memory_order_release ,则加载操作会使用 std::memory_order_relaxed

弱版本 (1-4) 可能出现伪失败。

目录

参数

expected - 预期在原子对象中找到的值的引用
desired - 若原子对象的值符合预期时,将要存储到原子对象中的值
success - 比较成功时读-修改-写操作的内存同步顺序。允许所有取值
failure - 比较失败时加载操作的内存同步顺序。不能为 std::memory_order_release std::memory_order_acq_rel ,且不能指定比 success 更强的顺序
order - 两个操作的内存同步顺序

返回值

true 表示底层原子值已发生改变, false 表示未发生改变。

备注

atomic_shared_ptr 对象本身的所有更改,以及所有关联的 use_count 递增操作,均保证以原子方式执行。关联的 use_count 递减操作发生在原子操作之后,但不要求作为其组成部分。任何关联的销毁或释放操作均在原子操作之后执行,且不属其组成部分。

若比较交换操作返回 true ,则 expected 在原子更新步骤后不会被访问。若返回 false ,则 expected 会被更新为从 atomic_shared_ptr 对象尝试原子更新时读取的现有值。与写入 expected 对应的 use_count 更新属于原子操作的一部分,但写入 expected 本身不要求作为原子操作的组成部分。

对于重载 (1,3,5,7) desired 在原子更新步骤之后不会被访问。

对于重载 (2,4,6,8) ,仅当比较交换操作返回 true 时,才会从 desired 移动数据;该移动操作发生在原子更新步骤之后。

注释

弱形式 (1-4) 的函数允许出现伪失败,即即使当 * this expected 等价时也可能错误地判定为不等价。当在循环中进行比较交换操作时,在某些平台上弱形式版本能提供更好的性能。

参见

std::shared_ptr 特化的原子操作
(函数模板)