gpt4 book ai didi

visual-c++ - 如何用原子操作实现 std::weak_ptr::lock?

转载 作者:行者123 更新时间:2023-12-05 05:51:43 26 4
gpt4 key购买 nike

最近想用C实现原子引用计数器,所以引用了STL中std::shared_ptr的实现,对weak_ptr::lock的实现很困惑。执行compared_and_exchange时,clang指定了memory_order_seq_cst,g++指定了memory_order_acq_rel,MSVC指定了memory_order_relaxed。我认为 memory_order_relaxed 已经足够了,因为如果 user_count 不为零,则不需要同步任何数据。我不是这方面的专家,谁能提供一些建议?

以下是代码片段:

MSVC

    bool _Incref_nz() noexcept { // increment use count if not zero, return true if successful
auto& _Volatile_uses = reinterpret_cast<volatile long&>(_Uses);
#ifdef _M_CEE_PURE
long _Count = *_Atomic_address_as<const long>(&_Volatile_uses);
#else
long _Count = __iso_volatile_load32(reinterpret_cast<volatile int*>(&_Volatile_uses));
#endif
while (_Count != 0) {
const long _Old_value = _INTRIN_RELAXED(_InterlockedCompareExchange)(&_Volatile_uses, _Count + 1, _Count);
if (_Old_value == _Count) {
return true;
}

_Count = _Old_value;
}

return false;
}

clang/libcxx

__shared_weak_count*
__shared_weak_count::lock() noexcept
{
long object_owners = __libcpp_atomic_load(&__shared_owners_);
while (object_owners != -1)
{
if (__libcpp_atomic_compare_exchange(&__shared_owners_,
&object_owners,
object_owners+1))
return this;
}
return nullptr;
}

gcc/libstdc++

 template<>
inline bool
_Sp_counted_base<_S_atomic>::
_M_add_ref_lock_nothrow() noexcept
{
// Perform lock-free add-if-not-zero operation.
_Atomic_word __count = _M_get_use_count();
do
{
if (__count == 0)
return false;
// Replace the current counter value with the old value + 1, as
// long as it's not changed meanwhile.
}
while (!__atomic_compare_exchange_n(&_M_use_count, &__count, __count + 1,
true, __ATOMIC_ACQ_REL,
__ATOMIC_RELAXED));
return true;
}

最佳答案

我正在尝试自己回答这个问题。

standard spec只说 weak_ptr::lock 应该作为原子操作执行,但没有更多关于内存顺序的信息。这样不同的线程就可以直接并行调用 weak_ptr::lock 而不会出现任何竞争条件,当这种情况发生时,不同的实现会提供不同的 memory_order。但无论如何,以上所有的实现都是正确的。

关于visual-c++ - 如何用原子操作实现 std::weak_ptr::lock?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/70331658/

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