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
|
|