namespace std { template <class T> T atomic_fetch_add_explicit( volatile atomic<T>* object, T operand, memory_order order) noexcept; // (1) C++11 template <class T> T atomic_fetch_add_explicit( volatile atomic<T>* object, typename atomic<T>::difference_type operand, memory_order order) noexcept; // (1) C++17 template <class T> T atomic_fetch_add_explicit( atomic<T>* object, T operand, memory_order order) noexcept; // (2) C++11 template <class T> T atomic_fetch_add_explicit( atomic<T>* object, typename atomic<T>::difference_type operand, memory_order order) noexcept; // (2) C++17 }
概要
アトミックに加算を行う
要件
- C++17 : 型
T
がオブジェクト型であること。型T
がvoid*
や関数ポインタであってはならない
効果
order
で指定されたメモリオーダーにしたがって、現在の値にoperand
を加算した値でアトミックに置き換える
戻り値
変更前の値が返される
例外
投げない
備考
符号付き整数型に対しては、2の補数表現による演算が行われ、未定義動作はない。アドレス型に関しては結果として未定義アドレスになる場合があるが、それ以外の未定義動作はない。
例
#include <iostream> #include <atomic> int main() { std::atomic<int> x(3); int before = std::atomic_fetch_add_explicit(&x, 2, std::memory_order_seq_cst); std::cout << before << std::endl; std::cout << x.load() << std::endl; }
出力
3
5
バージョン
言語
- C++11
処理系
- Clang: ??
- GCC:
- GCC, C++11 mode: 4.7.0
- ICC: ??
- Visual C++: 2012, 2013