命名空间
变体
操作

std::atomic_ref<T>::compare_exchange_weak, std::atomic_ref<T>::compare_exchange_strong

来自 cppreference.com
< cpp‎ | atomic‎ | atomic ref
 
 
并发支持库
线程
(C++11)
(C++20)
this_thread 命名空间
(C++11)
(C++11)
(C++11)
协作取消
互斥
通用锁管理
(C++11)
(C++11)
(C++11)
(C++11)
(C++11)
条件变量
(C++11)
信号量
闩锁和屏障
(C++20)
(C++20)
期货
(C++11)
(C++11)
(C++11)
(C++11)
安全回收
(C++26)
危险指针
原子类型
(C++11)
(C++20)
原子类型的初始化
(C++11)(C++20 中已弃用)
(C++11)(C++20 中已弃用)
内存排序
原子操作的自由函数
原子标志的自由函数
 
 
bool compare_exchange_weak( T& expected, T desired,

                            std::memory_order success,

                            std::memory_order failure ) const noexcept;
(1) (自 C++20 起)
bool compare_exchange_weak( T& expected, T desired,

                            std::memory_order order =

                                std::memory_order_seq_cst ) const noexcept;
(2) (自 C++20 起)
bool compare_exchange_strong( T& expected, T desired,

                              std::memory_order success,

                              std::memory_order failure ) const noexcept;
(3) (自 C++20 起)
bool compare_exchange_strong( T& expected, T desired,

                              std::memory_order order =

                                  std::memory_order_seq_cst ) const noexcept;
(4) (自 C++20 起)

原子地比较由 atomic_ref 对象引用的对象的值表示expected 的值表示,如果两者按位相等,则用 desired 替换前者(执行读-修改-写操作)。否则,将存储在引用的对象中的实际值加载到 expected 中(执行加载操作)。

读-修改-写和加载操作的内存模型分别是 successfailure。在(2)和(4)版本中,order 用于读-修改-写和加载操作,但如果 order == std::memory_order_acq_rel,则分别对加载操作使用 std::memory_order_acquirestd::memory_order_relaxed

内容

[编辑] 参数

expected - 对由 atomic_ref 对象引用的对象中预期找到的值的引用
desired - 如果对象符合预期,则要存储在引用的对象中的值
success - 如果比较成功,则用于读-修改-写操作的内存同步排序。所有值都允许
failure - 如果比较失败,则用于加载操作的内存同步排序。不能为 std::memory_order_releasestd::memory_order_acq_rel
order - 两种操作的内存同步排序

[编辑] 返回值

如果引用的对象已成功更改,则为 true,否则为 false

[编辑] 注意

比较和复制是按位进行的(类似于 std::memcmpstd::memcpy);不使用构造函数、赋值运算符或比较运算符。

函数的弱形式(1,2)允许以虚假的方式失败,也就是说,即使它们相等,也会像 *this != expected 一样起作用。当比较和交换位于循环中时,弱版本将在某些平台上产生更好的性能。

当弱比较并交换需要循环而强比较并交换不需要时,除非 `T` 的对象表示可能包含陷阱位,或为相同值提供多个对象表示(例如浮点 NaN),否则应优先使用强比较并交换。在这些情况下,弱比较并交换通常有效,因为它会迅速收敛到某个稳定的对象表示。

对于具有参与某些成员值表示但未参与其他成员值表示的位的联合,比较并交换可能会始终失败,因为当这些填充位不参与活动成员的值表示时,它们的值是不确定的。

从不参与对象值表示的填充位将被忽略。

[编辑] 示例