c++ - 关于shared_ptr的atomic_exchange_strong_explicit的实现

标签 c++ c++11

请参阅this链接:

template<typename _Tp>
  bool
  atomic_compare_exchange_strong_explicit(shared_ptr<_Tp>* __p,
                                          shared_ptr<_Tp>* __v,
                                          shared_ptr<_Tp> __w,
                                          memory_order,
                                          memory_order)
  {
    shared_ptr<_Tp> __x; // goes out of scope after __lock
    _Sp_locker __lock{__p, __v};
    owner_less<shared_ptr<_Tp>> __less;
    if (*__p == *__v && !__less(*__p, *__v) && !__less(*__v, *__p))
      {
        __x = std::move(*__p);
        *__p = std::move(__w);
        return true;
      }
    __x = std::move(*__v);
    *__v = *__p;
    return false;
  }

在我看来,*__p == *__v!__less(*__p, *__v) && !__less(*__v, *__p) 都是状态指针 *__p*__v 相等的事实。为什么它们都用在那里?

谢谢。

最佳答案

如前所述by this great answer我们都需要确保两个 shared_ptrs 共享同一个对象并共享该对象的相同所有权(两个共享指针是否使用相同的 ref 计数器?)。

*__p == *__v 通过比较 *__p.get() == *__v.get()!__less 检查第一部分(*__p, *__v) && !__less(*__v, *__p) 确保两个共享指针共享内部引用计数器,从而满足两个部分。

*__p == *__v 只检查所拥有对象的相等性,而不检查我们在这里需要的内部引用计数器的共享状态,这就是我们需要额外构造的原因.

关于c++ - 关于shared_ptr的atomic_exchange_strong_explicit的实现,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45303471/

相关文章:

c++ - 如何在 Eclipse CDT 中使用 google test 管理测试输出?

c++ - 如何防止在构造函数或析构函数中调用虚函数?

c# - 在 C++ 中定义的以下结构的 C# 等价物是什么

c++ - 使用 decltype 访问静态字段

c++ - 使用 std::random_device 和 pRNG 有什么区别,例如std::mt19937 和没有?

c++ - 通过 copy-and-swap 分配与两个锁

c++ - 使用 std::memcpy 在内存中移动对象

c++ - 给定一个源文件,有没有办法让 gcc 只返回直接包含的头文件列表?

c++ - 我怎样才能有模板化的 friend ?

c++ - 如何最好地为 C++11 中的 unique_ptr 中的普通数组制作迭代器?