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