首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

atomic_compare_exchange_strong

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

读取 - 修改 - 写入和加载操作的内存模型分别为succfail。(1-2)版本memory_order_seq_cst默认使用。

函数的弱形式((2)和(4))允许虚假地失败,即,*obj != *expected即使它们是相等的。当比较和交换处于循环中时,弱版本将在某些平台上产生更好的性能。当一个弱的比较和交换需要一个循环,而一个强大的循环不会,强壮的一个更可取。

这是为所有原子对象类型定义的通用函数A。该参数是指向易失性原子类型的指针,以接受非易失性和易失性(例如内存映射I/O)原子变量的地址。C是与之对应的非原子类型A

参数

OBJ

-

指向要测试和修改的原子对象的指针

expected

-

指向预期在原子对象中找到的值的指针

disired

-

如果按预期方式存储在原子对象中的值

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 |

扫码关注腾讯云开发者

领取腾讯云代金券