Spec-Zone.ru › C++

std::atomic_ref<T>::compare_exchange_weak, std::atomic_ref<T>::compare_exchange_strong

bool compare_exchange_weak
    ( value_type& expected, value_type desired,
      std::memory_order success, 
      std::memory_order failure ) const noexcept;
(1) (constexpr начиная с C++26)
bool compare_exchange_weak
    ( value_type& expected, value_type desired,
      std::memory_order order =
          std::memory_order_seq_cst ) const noexcept;
(2) (constexpr начиная с C++26)
bool compare_exchange_strong
    ( value_type& expected, value_type desired,
      std::memory_order success,
      std::memory_order failure ) const noexcept;
(3) (constexpr начиная с C++26)
bool compare_exchange_strong
    ( value_type& expected, value_type desired,
      std::memory_order order =
          std::memory_order_seq_cst ) const noexcept;
(4) (constexpr начиная с C++26)

Атомарно сравнивает представление значения объекта, на который ведёт ссылка, с представлением expected. Если они побитово равны, заменяет первое на desired (выполняет операцию чтения-модификации-записи). В противном случае загружает фактическое значение, хранящееся в объекте, на который ведёт ссылка, в expected (выполняет операцию загрузки).

1,3) Модели памяти для операций чтения-модификации-записи и загрузки — соответственно success и failure.
2,4) order используется для операций чтения-модификации-записи и загрузки, за исключением случаев, когда для операции загрузки используются std::memory_order_acquire и std::memory_order_relaxed, если order соответственно равно std::memory_order_acq_rel или std::memory_order_release.

Эти перегрузки участвуют в разрешении перегрузки только в том случае, если std::is_const_v<T> равно false.

Если failure не равно std::memory_order_relaxed, std::memory_order_consume, std::memory_order_acquire или std::memory_order_seq_cst, поведение не определено.

Параметры

expected - ссылка на значение, которое ожидается найти в объекте, на который ссылается объект atomic_ref
desired - значение, которое будет записано в объект, на который ведёт ссылка, если в нём содержится ожидаемое значение
success - порядок синхронизации памяти для операции чтения-модификации-записи в случае успешного сравнения
failure - порядок синхронизации памяти для операции загрузки в случае неудачного сравнения
order - порядок синхронизации памяти для обеих операций

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

true, если объект, на который ведёт ссылка, был успешно изменён; в противном случае — false.

Примечания

Сравнение и копирование выполняются побитово (аналогично std::memcmp и std::memcpy); конструктор, оператор присваивания и оператор сравнения не используются.

Слабые формы (1,2) функций могут завершиться ложным отказом, то есть вести себя так, как если бы *this != expected, даже если они равны. Если compare-and-exchange находится в цикле, слабая версия на некоторых платформах обеспечивает более высокую производительность.

Если слабая операция compare-and-exchange потребовала бы цикла, а сильная — нет, предпочтительна сильная версия, за исключением случаев, когда представление объекта типа value_type может содержать биты-ловушки или допускает несколько представлений объекта для одного и того же значения (например, NaN с плавающей точкой). В таких случаях слабая операция compare-and-exchange обычно работает, поскольку быстро сходится к одному из стабильных представлений объекта.

Для объединения, в котором некоторые биты участвуют в представлениях значений одних членов, но не других, операция compare-and-exchange может всегда завершаться неудачно, поскольку такие биты заполнения имеют неопределённые значения, когда они не участвуют в представлении значения активного члена.

Биты заполнения, которые никогда не участвуют в представлении значения объекта, игнорируются.

Отчёты об ошибках

Следующие отчёты об ошибках, изменяющие поведение, были ретроактивно применены к ранее опубликованным стандартам C++.

Отчёт об ошибке Применён к Поведение в опубликованной версии Исправленное поведение
LWG 3508
(P3323R1)
C++20 compare_exchange_weak и compare_exchange_strong
не имели смысла для constT
ограничены приёмом только T без const

Пример

© cppreference.com
Licensed under the Creative Commons Attribution-ShareAlike Unported License v3.0.
https://en.cppreference.com/cpp/atomic/atomic_ref/compare_exchange

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API