atomic_compare_exchange_weak, atomic_compare_exchange_strong, atomic_compare_exchange_weak_explicit, atomic_compare_exchange_strong_explicit
|
Определено в заголовочном файле
<stdatomic.h>
|
||
|
_Bool atomic_compare_exchange_strong
(
volatile
A
*
obj,
C * expected, C desired ) ; |
(1) | (начиная с C11) |
|
_Bool atomic_compare_exchange_weak
(
volatile
A
*
obj,
C * expected, C desired ) ; |
(2) | (начиная с C11) |
|
_Bool atomic_compare_exchange_strong_explicit
(
volatile
A
*
obj,
C
*
expected, C desired,
|
(3) | (начиная с C11) |
|
_Bool atomic_compare_exchange_weak_explicit
(
volatile
A
*
obj,
C
*
expected, C desired,
|
(4) | (начиная с C11) |
Атомарно сравнивает содержимое памяти, на которую указывает
obj
, с содержимым памяти, на которую указывает
expected
, и если они побитово равны, заменяет первое на
desired
(выполняет операцию чтение-изменение-запись). В противном случае загружает фактическое содержимое памяти, на которую указывает
obj
, в
*expected
(выполняет операцию загрузки).
Модели памяти для операций чтения-изменения-записи и загрузки —
succ
и
fail
соответственно. Версии (1-2) по умолчанию используют
memory_order_seq_cst
.
Слабые формы ((2) и (4)) функций могут ложно завершаться неудачей, то есть действовать так, как если бы * obj ! = * expected даже если они равны. Когда операция compare-and-exchange выполняется в цикле, слабая версия может давать лучшую производительность на некоторых платформах. Когда слабая операция compare-and-exchange потребовала бы цикла, а сильная — нет, предпочтительнее использовать сильную версию.
Это
обобщенная функция
, определенная для всех
атомарных типов объектов
A
. Аргументом является указатель на volatile атомарный тип для принятия адресов как не-volatile, так и
volatile
(например, отображенных в памяти I/O) атомарных объектов, и семантика volatile сохраняется при применении этой операции к volatile атомарным объектам.
C
является неатомарным типом, соответствующим
A
.
Не определено, является ли имя обобщённой функции макросом или идентификатором, объявленным с внешней линковкой. Если определение макроса подавляется для доступа к реальной функции (например, заключено в скобки как ( atomic_compare_exchange ) ( ... ) ), или программа определяет внешний идентификатор с именем обобщённой функции, поведение не определено.
Содержание |
Параметры
| obj | - | указатель на атомарный объект для проверки и модификации |
| expected | - | указатель на значение, которое ожидается найти в атомарном объекте |
| desired | - | значение для записи в атомарный объект, если он соответствует ожидаемому |
| succ | - | порядок синхронизации памяти для операции чтения-модификации-записи при успешном сравнении. Допустимы все значения. |
| fail | - |
порядок синхронизации памяти для операции загрузки при неудачном сравнении. Не может быть
memory_order_release
или
memory_order_acq_rel
и не может задавать более строгий порядок, чем
succ
|
Возвращаемое значение
Результат сравнения:
true
если
*obj
был равен
*exp
,
false
в противном случае.
Примечания
Поведение семейства функций
atomic_compare_exchange_*
такое, как если бы следующее было выполнено атомарно:
Ссылки
- Стандарт C17 (ISO/IEC 9899:2018):
-
- 7.17.7.4 Универсальные функции atomic_compare_exchange (стр. 207)
- Стандарт C11 (ISO/IEC 9899:2011):
-
- 7.17.7.4 Универсальные функции atomic_compare_exchange (стр: 283-284)
Смотрите также
|
обменивает значение со значением атомарного объекта
(функция) |
|
|
C++ documentation
для
atomic_compare_exchange_weak
,
atomic_compare_exchange_strong
,
atomic_compare_exchange_weak_explicit
,
atomic_compare_exchange_strong_explicit
|
|