gpt4 book ai didi

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

转载 作者:太空狗 更新时间:2023-10-29 22:57:14 27 4
gpt4 key购买 nike

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

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com