atomic<shared_ptr<>>
内部如何工作?我不是在要求控制块的机制以及存储的数据,这对我来说很容易想象,而是在 atomic<shared_ptr<>>
本身。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;
}
但这对我没有多大帮助。
一个简单的实现是对
atomic<shared_ptr<T>>
对象的地址进行哈希处理,并将哈希值用作互斥体数组的索引。所以当需要访问shared_ptr
对象时,对应的互斥锁就被锁定了。如果两个线程需要访问不同的 atomic<shared_ptr<T>>
对象,那么大多数时候它们会散列到不同的槽,这样就不会出现争用。
无锁实现很困难。您可以在此处找到讨论。