Метод exchange
Метод exchange класса atomic атомарно заменяет
текущее значение атомарной переменной на новое и возвращает
предыдущее значение. Операция является атомарной, то есть
никакой другой поток не может вмешаться между чтением старого
значения и записью нового. В первый параметр мы передаем новое
значение, которое нужно записать, а во второй необязательный
параметр - порядок памяти memory_order, по умолчанию
используется memory_order_seq_cst.
Синтаксис
atomic<T>::exchange(value, [order])
Пример
Давайте создадим атомарную переменную со значением 1
и заменим его на 2, сохранив предыдущее значение:
#include <iostream>
#include <atomic>
using namespace std;
int main()
{
atomic<int> a(1);
int old = a.exchange(2);
cout << "old: " << old << endl;
cout << "new: " << a.load() << endl;
return 0;
}
Результат выполнения кода:
"old: 1"
"new: 2"
Пример
Давайте продемонстрируем, что exchange возвращает
именно то значение, которое было до записи. Заменим строку
"abcde" на "12345":
#include <iostream>
#include <atomic>
#include <string>
using namespace std;
int main()
{
atomic<string> a("abcde");
string old = a.exchange("12345");
cout << "old: " << old << endl;
cout << "new: " << a.load() << endl;
return 0;
}
Результат выполнения кода:
"old: abcde"
"new: 12345"
Пример
Давайте явно укажем порядок памяти вторым параметром:
#include <iostream>
#include <atomic>
using namespace std;
int main()
{
atomic<int> a(1);
int old = a.exchange(2, memory_order_acq_rel);
cout << "old: " << old << endl;
cout << "new: " << a.load() << endl;
return 0;
}
Результат выполнения кода:
"old: 1"
"new: 2"
Смотрите также
-
класс
atomic,
который представляет атомарную переменную -
метод
load,
который атомарно читает значение переменной -
метод
store,
который атомарно записывает значение переменной -
метод
compare_exchange_strong,
который атомарно сравнивает и заменяет значение