函数
<atomic>

std::atomic_compare_exchange_weak

模板 (1)
template <class T>bool atomic_compare_exchange_weak (volatile atomic<T>* obj, T* expected, T val) noexcept;template <class T>bool atomic_compare_exchange_weak (atomic<T>* obj, T* expected, T val) noexcept;
重载 (2)
bool atomic_compare_exchange_weak (volatile A* obj, T* expected, T val) noexcept;bool atomic_compare_exchange_weak (A* obj, T* expected, T val) noexcept;
比较并交换包含的值(弱)
比较 obj 中包含的值与 expected 的值
- 如果为真,则将 val 替换为包含的值
- 如果为假,则将 expected 指向的值替换为包含的值

该函数始终访问包含的值来读取它,并在(如果比较为真)之后替换它。但整个操作是原子的:在读取值的那一刻和替换它那一刻之间,该值不能被其他线程修改。

请注意,此函数直接比较包含的值的物理内容与 expected 的内容;这可能导致在 operator== 比较相等的数值上出现失败的比较(如果底层类型具有填充位、陷阱值或相同值的替代表示),尽管这种比较在保留 expected 的循环中会快速收敛。

atomic_compare_exchange_strong 不同,此弱版本允许“虚假失败”,即使 expected 中的值确实与 obj 中包含的值相等,也返回 false。对于某些循环算法,此行为是可以接受的,并且可能在某些平台上带来显著的性能提升。在这些“虚假失败”的情况下,该函数返回 false,并且不修改 expected

对于非循环算法,通常首选 atomic_compare_exchange_strong

有关 atomic 的等效成员函数,请参阅 atomic::compare_exchange_weak

参数

obj
指向 atomic 对象的指针。
类型 A 代表其他重载的 *原子类型* (如果库不实现 *C 风格原子类型* 作为 atomic 的实例)。
expected
指向一个对象,其值将与包含的值进行比较,并且在不匹配的情况下可能被覆盖包含的值
T 是原子对象中包含的值的类型(atomic 的模板参数)。
val
如果 expected包含的值匹配,则要复制到包含对象的值。
T 是原子对象中包含的值的类型(atomic 的模板参数)。

返回值

true 表示 *expected包含的值相等(并且未发生虚假失败)。
否则返回 false

数据竞争

无数据竞争(原子操作)。该操作使用*顺序一致性*(memory_order_seq_cst)。

异常安全

无异常保证: 绝不抛出异常。

另见