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 或 order == std::memory_order_release,则加载操作分别使用 std::memory_order_acquire 和 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,则 expected 将使用从尝试的原子更新中的 atomic_weak_ptr
对象读取的现有值进行更新。与写入 expected 对应的 use_count
更新是原子操作的一部分,但写入 expected 本身不需要成为原子操作的一部分。
对于重载 (1,3,5,7),在原子更新步骤之后不会访问 desired。
对于重载 (2,4,6,8),仅当比较交换操作返回 true 时,才会从 desired 移动;移动发生在原子更新步骤之后。
[编辑] 注解
函数的弱形式 (1-4) 允许虚假失败,也就是说,即使 *this 和 expected 等价,也表现得好像它们不等价一样。当比较和交换在循环中时,弱版本将在某些平台上产生更好的性能。
[编辑] 参见
为 std::shared_ptr 特化原子操作(函数模板) |