Spec-Zone.ru › C

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,
                                               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 даже если они равны. Когда сравнение и обмен происходит в цикле, слабая версия обеспечивает лучшую производительность на некоторых платформах. Когда слабый сравнение-и-обмен требует цикл, а сильный — нет, предпочтительнее использовать сильный.

Это общая функция, определённая для всех типов атомных объектов A. Аргумент — указатель на атомный тип volatile для приема адресов как не-volatile, так и volatile (например, памяти с отображением ввода-вывода) атомных объектов, и семантика 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)

См. также

atomic_exchangeatomic_exchange_explicit
(C11)
меняет значение с значением атомного объекта
(функция)
C++ документация для atomic_compare_exchange_weak, atomic_compare_exchange_strong, atomic_compare_exchange_weak_explicit, atomic_compare_exchange_strong_explicit

© cppreference.com
Licensed under the Creative Commons Attribution-ShareAlike Unported License v3.0.
https://en.cppreference.com/w/c/atomic/atomic_compare_exchange

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API