std::atomic_ref<T>::compare_exchange_weak, std::atomic_ref<T>::compare_exchange_strong
bool compare_exchange_weak( T& expected, T desired, std::memory_order success, |
(1) | (自 C++20 起) |
bool compare_exchange_weak( T& expected, T desired, std::memory_order order = |
(2) | (自 C++20 起) |
bool compare_exchange_strong( T& expected, T desired, std::memory_order success, |
(3) | (自 C++20 起) |
bool compare_exchange_strong( T& expected, T desired, std::memory_order order = |
(4) | (自 C++20 起) |
原子地比较由 atomic_ref
对象引用的对象的值表示与 expected
的值表示,如果两者按位相等,则用 desired
替换前者(执行读-修改-写操作)。否则,将存储在引用的对象中的实际值加载到 expected
中(执行加载操作)。
读-修改-写和加载操作的内存模型分别是 success
和 failure
。在(2)和(4)版本中,order
用于读-修改-写和加载操作,但如果 order == std::memory_order_acq_rel
,则分别对加载操作使用 std::memory_order_acquire
和 std::memory_order_relaxed
。
内容 |
[编辑] 参数
expected | - | 对由 atomic_ref 对象引用的对象中预期找到的值的引用 |
desired | - | 如果对象符合预期,则要存储在引用的对象中的值 |
success | - | 如果比较成功,则用于读-修改-写操作的内存同步排序。所有值都允许 |
failure | - | 如果比较失败,则用于加载操作的内存同步排序。不能为 std::memory_order_release 或 std::memory_order_acq_rel |
order | - | 两种操作的内存同步排序 |
[编辑] 返回值
如果引用的对象已成功更改,则为 true
,否则为 false
。
[编辑] 注意
比较和复制是按位进行的(类似于 std::memcmp
和 std::memcpy
);不使用构造函数、赋值运算符或比较运算符。
函数的弱形式(1,2)允许以虚假的方式失败,也就是说,即使它们相等,也会像 *this != expected
一样起作用。当比较和交换位于循环中时,弱版本将在某些平台上产生更好的性能。
当弱比较并交换需要循环而强比较并交换不需要时,除非 `T` 的对象表示可能包含陷阱位,或为相同值提供多个对象表示(例如浮点 NaN),否则应优先使用强比较并交换。在这些情况下,弱比较并交换通常有效,因为它会迅速收敛到某个稳定的对象表示。
对于具有参与某些成员值表示但未参与其他成员值表示的位的联合,比较并交换可能会始终失败,因为当这些填充位不参与活动成员的值表示时,它们的值是不确定的。
从不参与对象值表示的填充位将被忽略。
[编辑] 示例
本节内容不完整。 原因:没有示例。 |