std::experimental::atomic_shared_ptr<T>:: compare_exchange_strong, std::experimental::atomic_shared_ptr<T>:: compare_exchange_weak
|
bool
compare_exchange_weak
(
std::
shared_ptr
<
T
>
&
expected,
const
std::
shared_ptr
<
T
>
&
desired,
std:: memory_order success, std:: memory_order failure ) noexcept ; |
(1) | |
|
bool
compare_exchange_weak
(
std::
shared_ptr
<
T
>
&
expected,
std::
shared_ptr
<
T
>
&&
desired,
std:: memory_order success, std:: memory_order failure ) noexcept ; |
(2) | |
|
bool
compare_exchange_weak
(
std::
shared_ptr
<
T
>
&
expected,
const
std::
shared_ptr
<
T
>
&
desired,
std:: memory_order order = std:: memory_order_seq_cst ) noexcept ; |
(3) | |
|
bool
compare_exchange_weak
(
std::
shared_ptr
<
T
>
&
expected,
std::
shared_ptr
<
T
>
&&
desired,
std:: memory_order order = std:: memory_order_seq_cst ) noexcept ; |
(4) | |
|
bool
compare_exchange_strong
(
std::
shared_ptr
<
T
>
&
expected,
const
std::
shared_ptr
<
T
>
&
desired,
std:: memory_order success, std:: memory_order failure ) noexcept ; |
(5) | |
|
bool
compare_exchange_strong
(
std::
shared_ptr
<
T
>
&
expected,
std::
shared_ptr
<
T
>
&&
desired,
std:: memory_order success, std:: memory_order failure ) noexcept ; |
(6) | |
|
bool
compare_exchange_strong
(
std::
shared_ptr
<
T
>
&
expected,
const
std::
shared_ptr
<
T
>
&
desired,
std:: memory_order order = std:: memory_order_seq_cst ) noexcept ; |
(7) | |
|
bool
compare_exchange_strong
(
std::
shared_ptr
<
T
>
&
expected,
std::
shared_ptr
<
T
>
&&
desired,
std:: memory_order order = std:: memory_order_seq_cst ) noexcept ; |
(8) | |
Атомарно сравнивает базовый
shared_ptr
в
*
this
с
expected
, и если они эквивалентны, заменяет первый на
desired
(выполняет операцию чтения-изменения-записи). В противном случае загружает фактическое значение, хранящееся в
*
this
в
expected
(выполняет операцию загрузки). Замена выполняется как с помощью оператора копирования или перемещения
shared_ptr
, в зависимости от ситуации.
Два
shared_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_shared_ptr
и все связанные инкременты
use_count
гарантированно выполняются атомарно. Связанные декременты
use_count
происходят после атомарной операции, но не требуют быть её частью. Любые связанные операции разрушения или освобождения памяти происходят после атомарной операции и не являются её частью.
Если операция compare-exchange возвращает
true
,
expected
не обращается после шага атомарного обновления. Если она возвращает
false
,
expected
обновляется существующим значением, прочитанным из объекта
atomic_shared_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
(шаблон функции) |