函数
<atomic>

std::atomic_compare_exchange_strong

template (1)
template <class T>bool atomic_compare_exchange_strong (volatile atomic<T>* obj, T* expected, T val) noexcept;template <class T>bool atomic_compare_exchange_strong (atomic<T>* obj, T* expected, T val) noexcept;
重载 (2)
bool atomic_compare_exchange_strong (volatile A* obj, T* expected, T val) noexcept;bool atomic_compare_exchange_strong (A* obj, T* expected, T val) noexcept;
比较并交换包含的值(强)
比较 obj 中包含的值与 expected 指向的值
- 如果相等,则将*包含的值*替换为 val
- 如果不相等,则将 expected 指向的值替换为*包含的值*。

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

请注意,此函数直接比较*包含的值*的物理内容与 expected 的内容;对于使用 operator== 比较相等的值,这可能会导致比较失败(如果底层类型有填充位、陷阱值或同一值的替代表示),尽管这种比较在保留 expected 的循环中会迅速收敛,就像通常与 atomic_compare_exchange_weak 一起使用的那样。

atomic_compare_exchange_weak 不同,此*强版本*被要求在 *expected* 确实与*包含的对象*比较相等时始终返回 true,不允许*虚假故障*。但是,在某些机器上,对于在循环中检查此项的某些算法,compare_exchange_weak 可能会带来显著的性能提升。

有关 atomic 的等效成员函数,请参见 atomic::compare_exchange_strong

参数

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

返回值

如果 *expected 与*包含的值*比较相等,则为 true
否则返回 false

数据竞争

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

异常安全

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

另见