Namespaces
Variants

std::experimental::atomic_weak_ptr<T>:: compare_exchange_strong, std::experimental::atomic_weak_ptr<T>:: compare_exchange_weak

From cppreference.net
**Примечание:** В данном случае весь текст внутри тегов ` ` представляет собой C++ код, который согласно инструкциям не подлежит переводу. HTML-разметка и атрибуты также сохранены без изменений. Единственный переводимый элемент "(1)" уже является числом и не требует перевода.
bool compare_exchange_weak ( std:: weak_ptr < T > & expected, const std:: weak_ptr < T > & desired,
std:: memory_order success, std:: memory_order failure ) noexcept ;
(1)
bool compare_exchange_weak ( std:: weak_ptr < T > & expected, std:: weak_ptr < T > && desired,
std:: memory_order success, std:: memory_order failure ) noexcept ;
(2)
bool compare_exchange_weak ( std:: weak_ptr < T > & expected, const std:: weak_ptr < T > & desired,
std:: memory_order order = std:: memory_order_seq_cst ) noexcept ;
(3)
bool compare_exchange_weak ( std:: weak_ptr < T > & expected, std:: weak_ptr < T > && desired,
std:: memory_order order = std:: memory_order_seq_cst ) noexcept ;
(4)
bool compare_exchange_strong ( std:: weak_ptr < T > & expected, const std:: weak_ptr < T > & desired,
std:: memory_order success, std:: memory_order failure ) noexcept ;
(5)
bool compare_exchange_strong ( std:: weak_ptr < T > & expected, std:: weak_ptr < T > && desired,
std:: memory_order success, std:: memory_order failure ) noexcept ;
(6)
bool compare_exchange_strong ( std:: weak_ptr < T > & expected, const std:: weak_ptr < T > & desired,
std:: memory_order order = std:: memory_order_seq_cst ) noexcept ;
(7)
bool compare_exchange_strong ( std:: weak_ptr < T > & expected, std:: weak_ptr < T > && desired,
std:: memory_order order = std:: memory_order_seq_cst ) noexcept ;
(8)

Атомарно сравнивает базовый weak_ptr в * this с expected , и если они эквивалентны, заменяет первый на desired (выполняет операцию чтения-изменения-записи). В противном случае загружает фактическое значение, хранящееся в * this в expected (выполняет операцию загрузки). Замена выполняется как с помощью оператора копирования или перемещения weak_ptr , в зависимости от ситуации.

Два weak_ptr эквивалентны тогда и только тогда, когда они хранят одинаковое значение указателя и разделяют владение.

Модели памяти для операций чтения-изменения-записи и загрузки - success и failure соответственно. Для перегрузок (3,4,7,8) , order используется как для операций чтения-изменения-записи, так и для операций загрузки, за исключением того, что std::memory_order_acquire и std::memory_order_relaxed используются для операции загрузки, если order == std:: memory_order_acq_rel или order == std:: memory_order_release соответственно.

Слабые версии (1-4) могут давать ложные срабатывания.

Содержание

Параметры

expected - ссылка на значение, которое ожидается найти в атомарном объекте
desired - значение для сохранения в атомарном объекте, если он соответствует ожидаемому
success - порядок синхронизации памяти для операции чтения-модификации-записи при успешном сравнении. Допустимы все значения
failure - порядок синхронизации памяти для операции загрузки при неудачном сравнении. Не может быть std::memory_order_release или std::memory_order_acq_rel и не может задавать более строгий порядок, чем success
order - порядок синхронизации памяти для обеих операций

Возвращаемое значение

true если базовое атомарное значение было изменено, false в противном случае.

Примечания

Все изменения самого объекта atomic_weak_ptr и все связанные инкременты use_count гарантированно выполняются атомарно. Связанные декременты use_count происходят после атомарной операции, но не требуют быть её частью. Любые связанные операции уничтожения или освобождения памяти происходят после атомарной операции и не являются её частью.

Если операция compare-exchange возвращает true , expected не обращается после шага атомарного обновления. Если она возвращает false , expected обновляется существующим значением, прочитанным из объекта atomic_weak_ptr при попытке атомарного обновления. Обновление use_count , соответствующее записи в expected , является частью атомарной операции, но сама запись в expected не обязана быть частью атомарной операции.

Для перегрузок (1,3,5,7) , desired не обращается после шага атомарного обновления.

Для перегрузок (2,4,6,8) , desired перемещается только если операция compare-exchange возвращает true ; перемещение происходит после этапа атомарного обновления.

Примечания

Слабые формы (1-4) функций могут давать ложные срабатывания, то есть действовать так, как если бы * this и expected не были эквивалентны, даже когда они эквивалентны. Когда операция compare-and-exchange выполняется в цикле, слабая версия может обеспечивать лучшую производительность на некоторых платформах.

Смотрите также

специализирует атомарные операции для std::shared_ptr
(шаблон функции)