关于shared_ptr的atomic_exchange_strong_explicit的实现

时间:2017-07-25 12:35:02

标签: 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相等的事实。为什么他们都在那里使用?

感谢。

1 个答案:

答案 0 :(得分:1)

关于by this great answer,我们需要确保两个shared_ptrs共享同一个对象并共享该对象的相同所有权(两个共享指针都使用相同的ref计数器吗?)。 / p>

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

*__p == *__v只检查拥有对象的相等性,而不是我们需要的内部ref计数器的共享状态,这就是为什么我们需要额外的构造。