atomic_compare_exchange_weak_explicit (Atomic operations) – C 中文开发手册

[
  •   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 语言中文开发手册
    ]
    转载请保留页面地址:https://www.breakyizhan.com/c-3/26839.html
    原文地址:https://www.cnblogs.com/breakyizhan/p/13252721.html