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)
См. также
|
(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