РЕПЕТИТОР математика физика информатика
Для школьников и студентов. Подтягивание пробелов. ЦЭ, ЦТ, ОГЭ, ЕГЭ.
Идет набор на ЛЕТО. Жмите для подробностей:)
802 of 815 menu

Метод 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"

Смотрите также

  • класс atomic,
    который представляет атомарные операции
  • метод load,
    который атомарно читает значение
  • метод store,
    который атомарно записывает значение
  • метод exchange,
    который атомарно заменяет значение
Мы используем cookie для работы сайта, аналитики и персонализации. Обработка данных происходит согласно Политике конфиденциальности.
принять все настроить отклонить