命名空间
变体
操作

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 定义的 通用函数。参数是指向易变原子类型的指针,以接受非易变和 易变(例如内存映射的 I/O)原子对象的地址,并且在将此操作应用于易变原子对象时会保留易变语义。C 是与 A 相对应的非原子类型。

通用函数的名称是宏还是带外部链接的标识符,这是未指定的。如果为了访问实际函数而抑制了宏定义(例如,像 (atomic_compare_exchange)(...) 一样加括号),或者程序定义了与通用函数同名的外部标识符,则行为未定义。

内容

[编辑] 参数

obj - 指向要测试和修改的原子对象的指针
expected - 指向预期在原子对象中找到的值的指针
desired - 如果原子对象如预期的那样,要存储在原子对象中的值
succ - 如果比较成功,则用于读-修改-写操作的内存同步排序。所有值都是允许的。
fail - 如果比较失败,则用于加载操作的内存同步排序。不能为 memory_order_releasememory_order_acq_rel,也不能指定比 succ 更强的排序

[编辑] 返回值

比较的结果:如果 *obj 等于 *exp,则为 true,否则为 false

[编辑] 说明

atomic_compare_exchange_* 族的行为就好像以下代码被原子地执行一样

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

[编辑] 参考文献

  • C17 标准 (ISO/IEC 9899:2018)
  • 7.17.7.4 atomic_compare_exchange 通用函数 (p: 207)
  • C11 标准 (ISO/IEC 9899:2011)
  • 7.17.7.4 atomic_compare_exchange 通用函数 (p: 283-284)

[编辑] 另请参见

将一个值与原子对象的值交换
(函数) [编辑]
C++ 文档atomic_compare_exchange_weak, atomic_compare_exchange_strong, atomic_compare_exchange_weak_explicit, atomic_compare_exchange_strong_explicit