Namespaces
Variants

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

From cppreference.net
Concurrency support library
Threads
(C++11)
(C++20)
this_thread namespace
(C++11)
(C++11)
Cooperative cancellation
Mutual exclusion
Generic lock management
Condition variables
(C++11)
Semaphores
Latches and Barriers
(C++20)
(C++20)
Futures
(C++11)
(C++11)
(C++11)
Safe reclamation
Hazard pointers
Atomic types
(C++11)
(C++20)
Initialization of atomic types
(C++11) (deprecated in C++20)
(C++11) (deprecated in C++20)
Memory ordering
(C++11) (deprecated in C++26)
Free functions for atomic operations
Free functions for atomic flags
bool compare_exchange_weak

( value_type & expected, value_type desired,
std:: memory_order success,

std:: memory_order failure ) const noexcept ;
(1) (自 C++26 起为 constexpr)
bool compare_exchange_weak

( value_type & expected, value_type desired,
std:: memory_order order =

std:: memory_order_seq_cst ) const noexcept ;
(2) (自 C++26 起为 constexpr)
bool compare_exchange_strong

( value_type & expected, value_type desired,
std:: memory_order success,

std:: memory_order failure ) const noexcept ;
(3) (自 C++26 起为 constexpr)
bool compare_exchange_strong

( value_type & expected, value_type desired,
std:: memory_order order =

std:: memory_order_seq_cst ) const noexcept ;
(4) (自 C++26 起为 constexpr)

以原子方式比较所引用对象的 值表示 expected 的值表示,若二者按位相等,则将前者替换为 desired (执行读-修改-写操作)。否则,将存储在引用对象中的实际值加载到 expected 中(执行加载操作)。

1,3) 读-修改-写操作与加载操作的内存模型分别为 success failure
2,4) order 参数同时用于读-修改-写操作和加载操作,但当 order std:: memory_order_acq_rel std:: memory_order_release 时,加载操作将分别使用 std:: memory_order_acquire std:: memory_order_relaxed

这些重载仅当 std:: is_const_v < T > false 时参与重载决议。

如果 failure 不是 std:: memory_order_relaxed std:: memory_order_consume std:: memory_order_acquire std:: memory_order_seq_cst ,则行为未定义。

目录

参数

expected - 预期值,即期望在 atomic_ref 对象所引用对象中找到的值
desired - 若对象值与预期值相符时,将存储至引用对象的目标值
success - 比较成功时,读-修改-写操作的内存同步排序方式
failure - 比较失败时,加载操作的内存同步排序方式
order - 两种操作统一采用的内存同步排序方式

返回值

true 表示引用的对象已成功更改, false 表示更改失败。

注释

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

弱形式 (1,2) 的函数允许出现伪失败,即即使 * this ! = expected 实际相等时也可能表现失败。当在循环中进行比较交换操作时,弱形式版本在某些平台上能提供更好的性能。

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

对于联合体中某些成员参与值表示而其他成员不参与的位,比较并交换操作可能总是失败,因为当这些填充位不参与当前活跃成员的值表示时,它们具有不确定的值。

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

缺陷报告

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

缺陷报告 适用范围 发布时行为 正确行为
LWG 3508
( P3323R1 )
C++20 compare_exchange_weak compare_exchange_strong
对于 const T 无意义
约束为仅接受非 const T

示例