Namespaces
Variants

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

From cppreference.net
Concurrency support library
Threads
(C++11)
(C++20)
this_thread namespace
(C++11)
(C++11)
Cooperative cancellation
Mutual exclusion
Generic lock management
Condition variables
(C++11)
Semaphores
Latches and Barriers
(C++20)
(C++20)
Futures
(C++11)
(C++11)
(C++11)
Safe reclamation
Hazard pointers
Atomic types
(C++11)
(C++20)
Initialization of atomic types
(C++11) (deprecated in C++20)
(C++11) (deprecated in C++20)
Memory ordering
(C++11) (deprecated in C++26)
Free functions for atomic operations
Free functions for atomic flags
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 потребовала бы цикла, а сильная — нет, предпочтительнее использовать сильную, за исключением случаев, когда объектное представление value_type может включать биты-ловушки или предоставляет множественные объектные представления для одного значения (например, NaN с плавающей точкой). В этих случаях слабая операция compare-and-exchange обычно работает, поскольку она быстро сходится к некоторому стабильному объектному представлению.

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

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

Отчёты о дефектах

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

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

Пример