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) | |
原子地比较 *this 中的底层 shared_ptr
和 expected,且若二者等价,则以 desired 取代前者(实施读修改写操作)。否则,加载 *this 存储的实际值到 expected 中(实施加载操作)。此替换如同以 shared_ptr
的复制或移动赋值运算符来进行(选择合适者)。
当且仅当两个 shared_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_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) 发生假性失败,就是说,即使 *this 和 expected 等价时其表现如同它们不等价。在循环中使用比较交换操作时,弱版本在一些平台上可能产生更好的性能。
参阅
为 std::shared_ptr 特化的原子操作 (函数模板) |