Метод compare_exchange_strong
Метод compare_exchange_strong класса atomic
выполняет атомарную операцию «сравнить и обменять».
Он сравнивает текущее значение атомарного объекта
с ожидаемым значением. Если они равны, метод записывает
новое значение в атомарный объект и возвращает true.
Если они не равны, метод записывает текущее значение
атомарного объекта в переменную с ожидаемым значением
и возвращает false.
В первый параметр мы передаем ссылку на ожидаемое значение,
а во второй - новое значение, которое нужно записать.
Третий необязательный параметр задает порядок синхронизации
для успешной операции, а четвертый - для неуспешной.
Синтаксис
bool compare_exchange_strong(T& expected, T desired);
bool compare_exchange_strong(T& expected, T desired,
std::memory_order success,
std::memory_order failure);
Пример
Давайте сравним текущее значение атомарного объекта
с ожидаемым значением 10. Если значения совпадут,
метод запишет новое значение 20 и вернет
true:
#include <iostream>
#include <atomic>
using namespace std;
int main()
{
atomic<int> num{10};
int expected = 10;
bool res = num.compare_exchange_strong(expected, 20);
cout << boolalpha;
cout << "res: " << res << endl;
cout << "num: " << num.load() << endl;
return 0;
}
Результат выполнения кода:
"res: true"
"num: 20"
Пример
Теперь рассмотрим случай, когда текущее значение
не совпадает с ожидаемым. Атомарный объект хранит
значение 10, а ожидаемое значение равно
5. Метод вернет false и запишет
в переменную expected актуальное значение
атомарного объекта:
#include <iostream>
#include <atomic>
using namespace std;
int main()
{
atomic<int> num{10};
int expected = 5;
bool res = num.compare_exchange_strong(expected, 20);
cout << boolalpha;
cout << "res: " << res << endl;
cout << "expected: " << expected << endl;
cout << "num: " << num.load() << endl;
return 0;
}
Результат выполнения кода:
"res: false"
"expected: 10"
"num: 10"