©
This document uses PHP Chinese website manual Release
在头文件<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,memory_order succ,memory_order fail); | (3) | (自C11以来) |
_Bool atomic_compare_exchange_weak_explicit(volatile A * obj,C * expected,C desired,memory_order succ,memory_order fail); | (4) | (自C11以来) |
将所指向的值obj
与所指向的值进行原子比较expected
,如果相等,则用前者替换前者desired
(执行读取 - 修改 - 写入操作)。否则,加载实际值所指向的obj
进入*expected
(进行负载操作)。
读取 - 修改 - 写入和加载操作的内存模型分别为succ
和fail
。(1-2)版本memory_order_seq_cst
默认使用。
函数的弱形式((2)和(4))允许虚假地失败,即,*obj != *expected
即使它们是相等的。当比较和交换处于循环中时,弱版本将在某些平台上产生更好的性能。当一个弱的比较和交换需要一个循环,而一个强大的循环不会,强壮的一个更可取。
这是为所有原子对象类型定义的通用函数A
。该参数是指向易失性原子类型的指针,以接受非易失性和易失性(例如内存映射I/O)原子变量的地址。C
是与之对应的非原子类型A
。
OBJ | - | 指向要测试和修改的原子对象的指针 |
---|---|---|
expected | - | 指向预期在原子对象中找到的值的指针 |
desired | - | 如果按预期方式存储在原子对象中的值 |
succ | - | 如果比较成功,则读取 - 修改 - 写入操作的存储器同步排序。所有的值都是允许的。 |
fail | - | 如果比较失败,则执行加载操作的内存同步排序。不能是memory_order_release或memory_order_acq_rel,并且不能指定比succ更强的排序 |
比较的结果:true
如果*obj
等于*exp
,否则false
。
行为atomic_compare_exchange_strong
就好像下面的代码是以原子方式执行的:
if (memcmp(obj, expected, sizeof *obj) == 0) memcpy(obj, &desired, sizeof *obj);else memcpy(expected, obj, sizeof *obj);
(标准措辞中称比较是以“value”的形式被DR 431改为“bitwise equality”)。
C11标准(ISO/IEC 9899:2011):
7.17.7.4 atomic_compare_exchange通用函数(p: 283-284)
atomic_exchangeatomic_exchange_explicit(C11) | 用原子对象(函数)的值交换一个值 |
---|
| C ++文档:atomic_compare_exchange_weak,atomic_compare_exchange_strong,atomic_compare_exchange_weak_explicit,atomic_compare_exchange_strong_explicit |