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 )原子对象。 C 是与 A 对应的非原子类型。

目录

[编辑] 参数

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

[编辑] 返回值

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

[编辑] 注意

atomic_compare_exchange_strong的行为如同下列内容原子性执行:

if (memcmp(obj, expected, sizeof *obj) == 0)
    memcpy(obj, &desired, sizeof *obj);
else
    memcpy(expected, obj, sizeof *obj);

(叙述以“值”比较的标准用词被DR 431更改为“逐位相等”)

[编辑] 参考

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

[编辑] 参阅

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