请参阅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/