std::atomic::fetch_add

仅为 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 类型,定义算术为使用补码。无未定义结果。

对于浮点类型,有影响的浮点环境可能异于调用方线程的浮点环境。

(C++20 起)

对于 T* 类型,结果可能为未定义的地址,但其他情况下运算无未定义行为。

目录

参数

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

参阅

将非原子值加到原子对象,并获得原子对象的先前值
(函数模板)

版本历史

  • (当前 | 先前 2017年12月9日 (六) 18:29Fruderica讨论 | 贡献 . . (2,229字节) (+1). . (撤销)
  • 当前 | 先前 2017年12月9日 (六) 18:29Fruderica讨论 | 贡献. . (2,228字节) (-25). . (fmt) (撤销)
  • 当前 | 先前 2017年12月8日 (五) 18:24Fruderica讨论 | 贡献 . . (2,253字节) (-14). . (撤销)
  • 当前 | 先前 2017年12月8日 (五) 18:23Fruderica讨论 | 贡献. . (2,267字节) (+198). . (p0020r6) (撤销)
  • 当前 | 先前 2017年10月14日 (六) 22:52Fruderica讨论 | 贡献. . (2,069字节) (-216). . (撤销)
  • 当前 | 先前 2013年7月2日 (二) 07:15P12bot讨论 | 贡献 . . (2,285字节) (-97). . (Use {{lc}}. Update links. Various fixes.) (撤销)
  • 当前 | 先前 2012年11月2日 (五) 16:53P12bot讨论 | 贡献 . . (2,382字节) (+281). . (r2.7.3) (机器人添加:de, en, es, fr, it, ja, pt, ru) (撤销)
  • 当前 | 先前 2012年10月26日 (五) 09:22P12讨论 | 贡献 . . (2,101字节) (0). . (1个修订: Translate from the English version) (撤销)
  • 当前 | 先前 2012年10月26日 (五) 06:00TranslationBot讨论 | 贡献. . (2,101字节) (-67). . (Translated from the English version using Google Translate) (撤销)
  • 当前 | 先前 2012年10月25日 (四) 13:13P12讨论 | 贡献 . . (2,168字节) (0). . (1个修订: Translate from the English version) (撤销)
  • 当前 | 先前) 2012年10月25日 (四) 12:00TranslationBot讨论 | 贡献. . (2,168字节) (+2,168). . (Translated from the English version using Google Translate)