atomic_compare_exchange_weak_explicit (Atomic operations) – C 中文开发手册
atomic_compare_exchange_weak_explicit (Atomic operations) - C 中文开发手册
在头文件<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 |
C 语言中文开发手册