请参阅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
相等的事实。为什么他们都在那里使用?
感谢。
答案 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计数器的共享状态,这就是为什么我们需要额外的构造。