Spec-Zone.ru › C++

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

bool compare_exchange_weak( T& expected, T desired,
                            std::memory_order success, 
                            std::memory_order failure ) const noexcept;
(1) (since C++20)
bool compare_exchange_weak( T& expected, T desired,
                            std::memory_order order =
                                std::memory_order_seq_cst ) const noexcept;
(2) (since C++20)
bool compare_exchange_strong( T& expected, T desired,
                              std::memory_order success, 
                              std::memory_order failure ) const noexcept;
(3) (since C++20)
bool compare_exchange_strong( T& expected, T desired,
                              std::memory_order order = 
                                  std::memory_order_seq_cst ) const noexcept;
(4) (since C++20)

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

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

Параметры

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

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

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

Примечания

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

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

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

Для объединения с битами, участвующими в представлении значений некоторых членов, но не других, сравнение и обмен могут всегда заканчиваться неудачей, потому что такие биты заполнения имеют неопределённые значения, когда они не участвуют в представлении значения активного члена.

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

Пример

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

Spec-Zone.ru

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