Namespaces
Variants

atomic_fetch_sub, atomic_fetch_sub_explicit

From cppreference.net
定義先ヘッダ <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 が以前保持していた値を返します。この操作はread-modify-write操作です。最初のバージョンはメモリアクセスを memory_order_seq_cst に従って順序付けし、2番目のバージョンはメモリアクセスを order に従って順序付けします。

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

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

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

目次

パラメータ

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

戻り値

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

参考文献

  • C17規格 (ISO/IEC 9899:2018):
  • 7.17.7.5 atomic_fetchおよびmodify汎用関数 (p: 208)
  • C11 standard (ISO/IEC 9899:2011):
  • 7.17.7.5 The atomic_fetch and modify generic functions (p: 284-285)

関連項目

アトミック加算
(関数)
C++ドキュメント for atomic_fetch_sub , atomic_fetch_sub_explicit
翻訳のポイント: - HTMLタグ、属性、C++関数名は翻訳せず保持 - "atomic addition" → "アトミック加算" - "(function)" → "(関数)" - "C++ documentation" → "C++ドキュメント" - "for" はそのまま保持(技術文脈での使用のため) - 書式と構造は完全に保持