名前空間
変種
操作

std::atomic<T>::fetch_add

提供: cppreference.com
< cpp‎ | atomic‎ | atomic
 
 
 
 
atomic<整数型>(C++11) および atomic<浮動小数点型>(C++20) テンプレート特殊化のみのメンバ
(1)
T fetch_add( T arg,
             std::memory_order order = std::memory_order_seq_cst ) noexcept;
T fetch_add( T arg,
             std::memory_order order = std::memory_order_seq_cst ) volatile noexcept;
atomic<T*> テンプレート特殊化のみのメンバ
(2)
T* fetch_add( std::ptrdiff_t arg,
              std::memory_order order = std::memory_order_seq_cst ) noexcept;
T* fetch_add( std::ptrdiff_t arg,
              std::memory_order order = std::memory_order_seq_cst ) volatile noexcept;

現在の値と arg を算術加算した結果で現在の値をアトミックに置き換えます。 この操作は読み込み-変更-書き込み操作です。 メモリは order の値に従って影響を受けます。

符号付きの整数型の場合、算術演算は2の補数表現を使用すると定義されています。 未定義の結果はありません。

浮動小数点型の場合、有効な浮動小数点環境は呼び出し元スレッドの浮動小数点環境と異なることがあります。 演算が対応する std::numeric_limits 型特性に従うことは、必要ではありませんが、推奨されます。 結果がその型で表現可能な値でない場合、結果は未規定ですが、それを除けば演算は未定義動作を持ちません。

(C++20以上)

T* 型の場合、結果が未定義のアドレスとなることはありますが、それを除けば演算は未定義動作を持ちません。 T がオブジェクト型でない場合、プログラムは ill-formed です。

目次

[編集] 引数

arg - 算術加算のもう一方の引数
order - 強制するメモリ順序制約

[編集] 戻り値

*this変更順序における、この関数の効果の直前の値。

[編集]

#include <iostream>
#include <thread>
#include <atomic>
 
std::atomic<long long> data;
void do_work()
{
    data.fetch_add(1, std::memory_order_relaxed);
}
 
int main()
{
    std::thread th1(do_work);
    std::thread th2(do_work);
    std::thread th3(do_work);
    std::thread th4(do_work);
    std::thread th5(do_work);
 
    th1.join();
    th2.join();
    th3.join();
    th4.join();
    th5.join();
 
    std::cout << "Result:" << data << '\n';
}

出力:

Result:5

[編集] 欠陥報告

以下の動作変更欠陥報告は以前に発行された C++ 標準に遡って適用されました。

DR 適用先 発行時の動作 正しい動作
P0558R1 C++11 arithmetic permitted on pointers to cv void or function made ill-formed

[編集] 関連項目

アトミックオブジェクトに非アトミック値を加算し、そのアトミックの以前の値を取得します
(関数テンプレート) [edit]