Namespaces
Variants

atomic_compare_exchange_weak, atomic_compare_exchange_strong, atomic_compare_exchange_weak_explicit, atomic_compare_exchange_strong_explicit

From cppreference.net
Определено в заголовочном файле <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,
memory_order succ,

memory_order fail ) ;
(3) (начиная с C11)
_Bool atomic_compare_exchange_weak_explicit ( volatile A * obj,

C * expected, C desired,
memory_order succ,

memory_order fail ) ;
(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_* такое, как если бы следующее было выполнено атомарно:

if (memcmp(obj, expected, sizeof *obj) == 0) {
    memcpy(obj, &desired, sizeof *obj);
    return true;
} else {
    memcpy(expected, obj, sizeof *obj);
    return false;
}

Ссылки

  • Стандарт 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