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

来自cppreference.com
 
 
实验性
技术规范
文件系统库 (文件系统 TS)
库基础 (库基础 TS)
库基础 2 (库基础 TS v2)
库基础 3 (库基础 TS v3)
并行扩展 (并行 TS)
并行扩展 2 (并行 TS v2)
并发扩展 (并发 TS)
并发扩展 2 (并发 TS v2)
概念 (概念 TS)
范围 (范围 TS)
反射 (反射 TS)
数学特殊函数 (特殊函数 TR)
实验性非 TS 功能特性
模式匹配
线性代数
std::execution
契约
2D 图形
 
 
 
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)

原子地比较 *this 中的底层 shared_ptrexpected,且若二者等价,则以 desired 取代前者(实施读修改写操作)。否则,加载 *this 存储的实际值到 expected 中(实施加载操作)。此替换如同以 shared_ptr 的复制或移动赋值运算符来进行(选择合适者)。

当且仅当两个 shared_ptr 存储相同的指针值且共享所有权时,二者等价。

读修改写操作和加载操作的内存模型分别为 successfailure。对于重载 (3,4,7,8)order 同时用于读修改写和加载操作,但当 order == std::memory_order_acq_relorder == std::memory_order_release 时,分别在加载操作使用 std::memory_order_acquirestd::memory_order_relaxed

弱版本 (1-4) 可能发生假性失败。

参数

expected - 到预期在原子对象中找到的值的引用
desired - 若符合预期则将在原子对象中存储的值
success - 当比较成功时用于读修改写操作的内存同步定序。允许任何值
failure - 当比较失败时用于加载操作的内存同步定序。不能是 std::memory_order_releasestd::memory_order_acq_rel 且不能指定强于 success 的定序
order - 用于两个操作的内存同步定序

返回值

若改变了底层原子值则为 true,否则为 false

说明

atomic_shared_ptr 对象自身的所有改动,所有关联的 use_count 自增均保证原子地实施。所有关联的 use_count 自减都在原子操作之后发生,而并不要求是其一部分。任何关联的析构或解分配操作均在验证操作之后发生,且不是其一部分。

若比较交换操作返回 true,则在原子更新步骤后不会访问 expected。若其返回 false,则以所尝试的原子更新中从 atomic_shared_ptr 中读取的值更新 expected。对应于向 expected 写入的 use_count 更新是原子操作的一部分,但向 expected 写入自身则不必是原子操作的一部分。

对于重载 (1,3,5,7),在原子更新步骤后不会访问 desired

对于重载 (2,4,6,8),仅当比较交换操作返回 true 时才从 desired 移动;此移动在原子更新步骤之后发生。

注解

允许函数的弱形式 (1-4) 发生假性失败,就是说,即使 *thisexpected 等价时其表现如同它们不等价。在循环中使用比较交换操作时,弱版本在一些平台上可能产生更好的性能。

参阅

std::shared_ptr 特化的原子操作
(函数模板)