命名空间
变体
操作

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
契约
二维图形
 
 
 
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_rel,则分别对加载操作使用 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,则 expected 会使用在尝试原子更新时从 atomic_shared_ptr 对象中读取的现有值进行更新。与写入 expected 相对应的 use_count 更新是原子操作的一部分,但写入 expected 本身不需要是原子操作的一部分。

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

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

[编辑] 注意事项

弱形式 (1-4) 的函数允许虚假失败,也就是说,即使 *thisexpected 等效,它们也会表现得好像不等效一样。当比较并交换操作在一个循环中时,弱版本在某些平台上会产生更好的性能。

[编辑] 另见

std::shared_ptr 特化原子操作
(函数模板) [编辑]