Пространства имён
Варианты
Действия

std::atomic::fetch_add

Материал из cppreference.com
 
 
Библиотека атомарных операций
 
 
<tbody> </tbody>
T fetch_add( T arg, std::memory_order order = std::memory_order_seq_cst ); T fetch_add( T arg, std::memory_order order = std::memory_order_seq_cst ) volatile;
(Только для специализации шаблона atomic<Integral>)
(начиная с C++11)
T* fetch_add( std::ptrdiff_t arg, std::memory_order order = std::memory_order_seq_cst ); T* fetch_add( std::ptrdiff_t arg, std::memory_order order = std::memory_order_seq_cst ) volatile;
(Только для специализации шаблона atomic<T*>)
(начиная с C++11)

Атомарно заменяет текущее значение результатом арифметического сложения значения и arg. Операция атомарного изменения (read-modify-write). Обращения к памяти происходят в соответствии со значением order.

Для знаковых интегральных (Integral) типов используется арифметика дополнительного кода. Результат всегда определен. Для типов T* результат может быть неопределенным адресом, но сама операция не приводит к неопределенному поведению.

Параметры

arg Второе слагаемое арифметического сложения
memory_order Ограничения порядка доступа к памяти

Возвращаемое значение

Значение атомарной переменной до вызова.

Исключения

спецификация noexcept:  
noexcept
  

Пример

#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

См. также

добавляет неатомарное значение к атомарному объекту и получает предыдущее атомарное значение
(шаблон функции) [править]