std::atomic_ref<T>::compare_exchange_weak, std::atomic_ref<T>::compare_exchange_strong
bool compare_exchange_weak ( value_type& expected, value_type desired, | (1) | (C++26 起为 constexpr) |
bool compare_exchange_weak ( value_type& expected, value_type desired, | (2) | (C++26 起为 constexpr) |
bool compare_exchange_strong ( value_type& expected, value_type desired, | (3) | (C++26 起为 constexpr) |
bool compare_exchange_strong ( value_type& expected, value_type desired, | (4) | (C++26 起为 constexpr) |
原子地比较被引用对象的值表示与 expected 的值表示,如果它们逐位相等,那么就会以 desired 替换前者(进行读修改写操作)。否则,将存储于被引用对象的实际值加载到 expected 中(进行加载操作)。
这些重载只有在 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 |
[编辑]示例
本节未完成 原因:暂无示例 |