atomic_compare_exchange_weak

atomic_compare_exchange_weak, atomic_compare_exchange_strong, atomic_compare_exchange_weak_explicit, atomic_compare_exchange_strong_explicit

在头文件中定义
_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(进行负载操作)。

读取 - 修改 - 写入和加载操作的内存模型分别为succfail。(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):

另请参阅

atomic_exchangeatomic_exchange_explicit(C11)用原子对象(函数)的值交换一个值

| C ++文档:atomic_compare_exchange_weak,atomic_compare_exchange_strong,atomic_compare_exchange_weak_explicit,atomic_compare_exchange_strong_explicit |