原子<shared_ptr<>>内部如何工作?

问题描述 投票:0回答:1

atomic<shared_ptr<>>
内部如何工作?我不是在要求控制块的机制以及存储的数据,这对我来说很容易想象,而是在
atomic<shared_ptr<>>
本身。
对于 VC++,原子存储的代码是:

void store(shared_ptr<_Ty> _Value, const memory_order _Order = memory_order_seq_cst) noexcept {
    _Check_store_memory_order(_Order);
    const auto _Rep                  = this->_Repptr._Lock_and_load();
    remove_extent_t<_Ty>* const _Tmp = _Value._Ptr;
    _Value._Ptr                      = this->_Ptr.load(memory_order_relaxed);
    this->_Ptr.store(_Tmp, memory_order_relaxed);
    this->_Repptr._Store_and_unlock(_Value._Rep);
    _Value._Rep = _Rep;
}

但这对我没有多大帮助。

c++ c++20 shared-ptr stdatomic
1个回答
0
投票

一个简单的实现是对

atomic<shared_ptr<T>>
对象的地址进行哈希处理,并将哈希值用作互斥体数组的索引。所以当需要访问
shared_ptr
对象时,对应的互斥锁就被锁定了。如果两个线程需要访问不同的
atomic<shared_ptr<T>>
对象,那么大多数时候它们会散列到不同的槽,这样就不会出现争用。

无锁实现很困难。您可以在此处找到讨论。

© www.soinside.com 2019 - 2024. All rights reserved.