名前空間
変種
操作

atomic_fetch_sub, atomic_fetch_sub_explicit

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

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

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

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

符号付き整数型の場合、算術演算は2の補数表現を使用するように定義されています。未定義の結果はありません。ポインタ型の場合、結果は未定義のアドレスになる可能性がありますが、それ以外の操作には未定義の動作はありません。

目次

[編集] パラメータ

obj - 操作対象のアトミックオブジェクトへのポインタ
arg - アトミックオブジェクトに格納されている値から減算する値
order - この操作のメモリ同期順序:すべての値が許可されます

[編集] 戻り値

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

[編集] 参考文献

  • C17標準 (ISO/IEC 9899:2018)
  • 7.17.7.5 The atomic_fetch and modify generic functions (p: 208)
  • C11標準 (ISO/IEC 9899:2011)
  • 7.17.7.5 The atomic_fetch and modify generic functions (p: 284-285)

[編集] 関連項目

アトミック加算
(関数) [編集]
C++ ドキュメントatomic_fetch_sub, atomic_fetch_sub_explicit について)
English 日本語 中文(简体) 中文(繁體)