Метод fetch_add
Метод fetch_add класса atomic атомарно прибавляет
заданное число к текущему значению атомарной переменной и
возвращает то значение, которое было до прибавления. В первый
параметр мы передаем число, которое нужно прибавить, а во второй
необязательный параметр - порядок доступа к памяти
(memory_order). Метод гарантирует, что операция
«чтение-изменение-запись» выполнится как единое целое, без
вмешательства других потоков.
Синтаксис
atomic.fetch_add(value, [order])
Пример
Давайте прибавим число 5 к атомарной переменной,
изначально равной 10, и выведем возвращённое
предыдущее значение:
#include <iostream>
#include <atomic>
using namespace std;
int main()
{
atomic<int> num(10);
int res = num.fetch_add(5);
cout << res << endl;
cout << num.load() << endl;
return 0;
}
Результат выполнения кода:
10
15
Пример
Давайте с помощью метода fetch_add посчитаем,
сколько раз несколько потоков увеличили общий счётчик:
#include <iostream>
#include <atomic>
#include <thread>
using namespace std;
atomic<int> counter(0);
void worker()
{
for (int i = 0; i < 1000; i++)
{
counter.fetch_add(1);
}
}
int main()
{
thread t1(worker);
thread t2(worker);
t1.join();
t2.join();
cout << counter.load() << endl;
return 0;
}
Результат выполнения кода:
2000