名前空間
変種
操作

atomic_exchange, atomic_exchange_explicit

From cppreference.com
< C‎ | atomic
ヘッダ<stdatomic.h>で定義
C atomic_exchange( volatile A* obj, C desired );
(1) (C11 以降)
C atomic_exchange_explicit( volatile A* obj, C desired, memory_order order );
(2) (C11 以降)

objが指す値をdesiredでアトミックに置き換え、objが以前保持していた値を返します。この操作は読み取り-変更-書き込み操作です。最初のバージョンは、メモリ操作をmemory_order_seq_cstに従って順序付けします。2番目のバージョンは、メモリ操作をorderに従って順序付けします。

これは、すべてのアトミックオブジェクト型Aに対して定義された汎用関数です。引数は、非volatileなアトミックオブジェクトとvolatile(例: メモリマップドI/O)なアトミックオブジェクトの両方のメモリアドレスを受け入れるために、volatileアトミック型へのポインタです。volatileアトミックオブジェクトにこの操作を適用する場合、volatileセマンティクスが保持されます。CAに対応する非アトミック型です。

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

目次

[編集] パラメータ

obj - 操作対象のアトミックオブジェクトへのポインタ
desired - アトミックオブジェクトを置き換える値
order - この操作のメモリ同期順序:すべての値が許可されます

[編集] 戻り値

objが指すアトミックオブジェクトが以前保持していた値。

[編集] 参考文献

  • C17標準 (ISO/IEC 9899:2018)
  • 7.17.7.3 The atomic_exchange generic functions (p: 207)
  • C11標準 (ISO/IEC 9899:2011)
  • 7.17.7.3 The atomic_exchange generic functions (p: 283)

[編集] 関連項目

古い値が期待値と同じであればアトミックオブジェクトと値を交換し、そうでなければ古い値を読み込む
(関数) [編集]
C++ドキュメント atomic_exchange, atomic_exchange_explicit
English 日本語 中文(简体) 中文(繁體)