名前空間
変種
操作

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 にロードします (ロード操作を行います)。

これらの読み込み-変更-書き込みおよびロード操作に対するメモリモデルはそれぞれ succ および fail です。 (1-2) のバージョンはデフォルトでは memory_order_seq_cst を使用します。

この関数の weak 形式 ((2) および (4)) は、 spurious に失敗することが許されています。 つまり、等しい場合でも *obj != *expected であるかのように動作することがあります。 compare-and-exchange がループ内にある場合、プラットフォームによっては weak の方が良い性能を発揮します。 weak の compare-and-exchange ではループを必要とし、 strong ではそうでないときは、 strong の方が好まれます。

これはすべてのアトミックオブジェクト型 A に対して定義される総称関数です。 引数は非 volatile と volatile (メモリマップド I/O など) 両方のアトミック変数のアドレスを受理するための volatile アトミック型へのポインタです。 CA に対応する非アトミック型です。

目次

[編集] 引数

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)

[編集] 関連項目

値とアトミックオブジェクトの値を交換します
(関数) [edit]
atomic_compare_exchange_weak, atomic_compare_exchange_strong, atomic_compare_exchange_weak_explicit, atomic_compare_exchange_strong_explicitC++リファレンス