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 が等しい場合でも、等しくないかのように動作することがあります。比較交換がループ内で行われる場合、弱いバージョンは一部のプラットフォームでより優れたパフォーマンスを発揮します。弱い比較交換がループを必要とし、強い比較交換がループを必要としない場合、強いバージョンが推奨されます。

これはすべての generic function に対して定義された atomic object types A です。引数はvolatile atomic型へのポインタであり、非volatileと volatile (メモリマップドI/Oなど)の両方のatomicオブジェクトのアドレスを受け入れます。また、volatile atomicオブジェクトにこの操作を適用する際にはvolatileセマンティクスが保持されます。 C A に対応する非atomic型です。

ジェネリック関数の名前がマクロであるか、外部リンケージで宣言された識別子であるかは未規定です。実際の関数にアクセスするために(例えば括弧で囲んで ( atomic_compare_exchange ) ( ... ) のように)マクロ定義が抑制された場合、またはプログラムがジェネリック関数の名前で外部識別子を定義した場合、動作は未定義です。

目次

パラメータ

obj - テストおよび変更するアトミックオブジェクトへのポインタ
expected - アトミックオブジェクト内に存在することが期待される値へのポインタ
desired - 期待値と一致した場合にアトミックオブジェクトに格納する値
succ - 比較が成功した場合の読み込み-修正-書き込み操作のメモリ同期順序。すべての値が許可されます。
fail - 比較が失敗した場合のロード操作のメモリ同期順序。 memory_order_release または memory_order_acq_rel にはできず、 succ よりも強い順序付けを指定することはできません

戻り値

比較の結果: true *obj *exp と等しい場合、 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++ documentation for atomic_compare_exchange_weak , atomic_compare_exchange_strong , atomic_compare_exchange_weak_explicit , atomic_compare_exchange_strong_explicit