Namespaces
Variants

atomic_compare_exchange_weak, atomic_compare_exchange_strong, atomic_compare_exchange_weak_explicit, atomic_compare_exchange_strong_explicit

From cppreference.net
定义于头文件 <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 类型 原子对象 定义的 泛型函数 。该参数是指向volatile原子类型的指针,用于接受非volatile和 volatile (例如内存映射I/O)原子对象的地址,并且在对此类volatile原子对象应用此操作时会保留volatile语义。 C 是与 A 对应的非原子类型。

未指定泛型函数的名称是宏还是具有外部链接的标识符。若为访问实际函数而抑制宏定义(例如采用括号形式如 ( atomic_compare_exchange ) ( ... ) ),或程序定义了与泛型函数同名的外部标识符,则行为未定义。

目录

参数

obj - 指向待测试和修改的原子对象的指针
expected - 指向期望在原子对象中查找到的值的指针
desired - 若原子对象的值符合预期时,将要存储到原子对象中的值
succ - 比较成功时读-修改-写操作的内存同步顺序。允许所有取值。
fail - 比较失败时加载操作的内存同步顺序。不能为 memory_order_release memory_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