atomic_compare_exchange_weak, atomic_compare_exchange_strong, atomic_compare_exchange_weak_explicit, atomic_compare_exchange_strong_explicit

来自cppreference.com
< c‎ | atomic
定义于头文件 <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 定义的泛型函数。参数为指向 volatile 原子对象的指针,以接受非 volatile 与 volatile (例如内存映射 I/O )的原子对象,而 volatile 语义在应用此操作时保留。 C 为对应 A 的非原子类型。

泛型函数名是宏或是声明有外部链接的标识符是未指定的。若为访问实际函数压制宏定义(例如像 (atomic_compare_exchange)(...) 这样加括号),或程序定义拥有泛型函数名的外部标识符,则行为未定义。

参数

obj - 指向要测试及修改的原子对象的指针
expected - 指向期待在原子对象中找到的值的指针
desired - 要存储于原子对象的值,若它得到期待
succ - 读修改写操作的内存同步顺序,若比较成功。容许所有值。
fail - 加载操作的内存同步顺序,若比较失败。不能为 memory_order_releasememory_order_acq_rel 且不能指定强于 succ 的顺序

返回值

比较结果:若 *obj 等于 *expected 则为 true ,否则 false

注解

atomic_compare_exchange_strong 表现为如同原子地执行下列代码:

if (memcmp(obj, expected, sizeof *obj) == 0) {
    memcpy(obj, &desired, sizeof *obj);
    return true
} else {
    memcpy(expected, obj, sizeof *obj);
    return false;
}

引用

  • C11 标准(ISO/IEC 9899:2011):
  • 7.17.7.4 The atomic_compare_exchange generic functions (p: 283-284)

参阅

与原子对象的值交换值
(函数)