# std::atomic<T>::fetch_add

< cpp‎ | atomic‎ | atomic

仅为 `atomic<Integral>`(C++11) 与 `atomic<Floating>`(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` 的值影响内存。

对于有符号 `Integral` 类型，定义算术为使用补码。无未定义结果。

对于 `T*` 类型，结果可能为未定义的地址，但此外运算无未定义行为。

对于浮点类型，有影响的浮点环境可能异于调用方线程的浮点环境。操作不必遵循对应的 std::numeric_limits 特性，但鼓励这么做。若结果不是其类型所能表示的值，则结果未指定，但此外操作无未定义行为。 若 std::atomic<T>::is_always_lock_free 为 false 则 volatile 限定版本被弃用。 | (C++20 起)

### 参数

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 | 曾容许指向 cv void 或函数的指针 | 使之为谬构

### 参阅

atomic_fetch_add atomic_fetch_add_explicit (C++11)(C++11) | 将非原子值加到原子对象，并获得原子对象的先前值 (函数模板)