atomic_compare_exchange_weak, atomic_compare_exchange_strong, atomic_compare_exchange_weak_explicit, atomic_compare_exchange_strong_explicit
在标头 <stdatomic.h> 定义
|
||
_Bool atomic_compare_exchange_strong( volatile A* obj, C* expected, C desired ); |
(1) | (C11 起) |
_Bool atomic_compare_exchange_weak( volatile A *obj, C* expected, C desired ); |
(2) | (C11 起) |
_Bool atomic_compare_exchange_strong_explicit( volatile A* obj, C* expected, C desired, |
(3) | (C11 起) |
_Bool atomic_compare_exchange_weak_explicit( volatile A *obj, C* expected, C desired, |
(4) | (C11 起) |
原子地比较 obj
所指向对象的内存的内容与 expected
所指向的内存的内容。若它们逐位相等,则以 desired
替换前者(进行读修改写操作)。否则,将 obj
所指向的实际内存内容加载到 *expected
(进行加载操作)。
读修改写和加载操作的内存模型分别为 succ
和 fail
。 (1-2) 版本默认使用 memory_order_seq_cst 。
函数的弱形式( (2) 与 (4) )允许虚假失败,即表现为如同 *obj != *expected ,即使它们相等。当比较并交换在循环中时,弱版本在某些平台上会生成更好的性能。在弱版本会要求循环而强版本不要求时,最好用强版本。
这是为所有原子对象类型 A
定义的泛型函数。其实参为指向 volatile 原子类型的指针,以接受非 volatile 与 volatile (例如内存映射 I/O )的原子对象,而在对 volatile 原子对象应用此操作时保留 volatile 语义。 C
为对应于 A
的非原子类型。
泛型函数的名字是宏还是声明有外部链接的标识符是未指定的。若为访问实际函数而压制宏定义(例如像 (atomic_compare_exchange)(...) 这样加括号),或程序定义了拥有泛型函数名的外部标识符,则行为未定义。
参数
obj | - | 指向要测试及修改的原子对象的指针 |
expected | - | 指向期待在原子对象中找到的值的指针 |
desired | - | 要存储于原子对象的值,若它得到期待 |
succ | - | 读修改写操作的内存同步顺序,若比较成功。容许所有值。 |
fail | - | 加载操作的内存同步顺序,若比较失败。不能为 memory_order_release 或 memory_order_acq_rel 且不能指定强于 succ 的顺序
|
返回值
比较结果:若 *obj
等于 *expected
则为 true ,否则 false 。
注解
atomic_compare_exchange_*
一族函数的行为表现为如同原子地执行下列代码:
引用
- C17 标准(ISO/IEC 9899:2018):
- 7.17.7.4 The atomic_compare_exchange generic functions (第 207 页)
- C11 标准(ISO/IEC 9899:2011):
- 7.17.7.4 The atomic_compare_exchange generic functions (第 283-284 页)
参阅
将原子对象的值与一个值交换 (函数) |