std::experimental::atomic_weak_ptr<T>:: compare_exchange_strong, std::experimental::atomic_weak_ptr<T>:: compare_exchange_weak
|
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) | |
以原子方式比较
*
this
中的底层
weak_ptr
与
expected
,若二者等价,则将前者替换为
desired
(执行读-修改-写操作)。否则,将实际存储在
*
this
中的值加载到
expected
中(执行加载操作)。此替换操作通过
weak_ptr
的拷贝或移动赋值运算符按需执行。
两个
weak_ptr
当且仅当存储相同指针值且共享所有权时是等价的。
读-修改-写操作与加载操作的内存模型分别为 success 和 failure 。对于重载版本 (3,4,7,8) , order 同时作用于读-修改-写和加载操作,但以下情况除外:若 order == std:: memory_order_acq_rel ,则加载操作使用 std::memory_order_acquire ;若 order == std:: memory_order_release ,则加载操作使用 std::memory_order_relaxed 。
弱版本 (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
递减操作发生在原子操作之后,但不要求作为原子操作的一部分。任何关联的销毁或释放操作都在原子操作之后执行,且不属其组成部分。
若比较交换操作返回
true
,则在原子更新步骤后不会访问
expected
。若返回
false
,则会用从
atomic_weak_ptr
对象尝试原子更新时读取的现有值更新
expected
。与写入
expected
对应的
use_count
更新属于原子操作的一部分,但写入
expected
本身不要求作为原子操作的组成部分。
对于重载 (1,3,5,7) , desired 在原子更新步骤之后不会被访问。
对于重载 (2,4,6,8) ,仅当比较交换操作返回 true 时才会从 desired 进行移动;该移动操作发生在原子更新步骤之后。
注释
弱形式 (1-4) 的函数允许伪失败,即当 * this 与 expected 实际等价时仍可能表现为不等价。当比较交换操作处于循环中时,在某些平台上弱形式版本能提供更好的性能。
参见
为
std::shared_ptr
特化的原子操作
(函数模板) |