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
等于 *exp
,则为 true,否则为 false。
[编辑] 注解
atomic_compare_exchange_*
族的行为如同原子地执行了以下操作
[编辑] 参考文献
- C17 标准 (ISO/IEC 9899:2018)
- 7.17.7.4 atomic_compare_exchange 泛型函数 (p: 207)
- C11 标准 (ISO/IEC 9899:2011)
- 7.17.7.4 atomic_compare_exchange 泛型函数 (p: 283-284)
[编辑] 参见
将值与原子对象的值交换 (函数) | |
C++ 文档 关于 atomic_compare_exchange_weak, atomic_compare_exchange_strong, atomic_compare_exchange_weak_explicit, atomic_compare_exchange_strong_explicit
|