std::atomic_ref<T>:: compare_exchange_weak, std::atomic_ref<T>:: compare_exchange_strong
|
|
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| Member functions | ||||
|
atomic_ref::compare_exchange_strong
atomic_ref::compare_exchange_weak
|
||||
|
(C++26)
|
||||
|
Operations for arithmetic types
(except
bool
and pointer-to-object)
|
||||
|
Operations for integral types
(except
bool
and pointer-to-object)
|
||||
|
(C++26)
|
||||
|
(C++26)
|
||||
|
Operations for integral types
(except
bool
)
|
||||
| Constants | ||||
|
bool
compare_exchange_weak
(
value_type
&
expected, value_type desired,
|
(1) | (constexpr начиная с C++26) |
|
bool
compare_exchange_weak
(
value_type
&
expected, value_type desired,
|
(2) | (constexpr начиная с C++26) |
|
bool
compare_exchange_strong
(
value_type
&
expected, value_type desired,
|
(3) | (constexpr начиная с C++26) |
|
bool
compare_exchange_strong
(
value_type
&
expected, value_type desired,
|
(4) | (constexpr начиная с C++26) |
Атомарно сравнивает представление значения указанного объекта с представлением expected , и если они побитово равны, заменяет первое на desired (выполняет операцию чтения-изменения-записи). В противном случае загружает фактическое значение, хранящееся в указанном объекте, в expected (выполняет операцию загрузки).
Эти перегрузки участвуют в разрешении перегрузки только если 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
|
Пример
|
Этот раздел не завершён
Причина: отсутствует пример |