为什么std::shared_ptr中的计数器是原子计数器



_Sp_counted_base的实现使用原子计数器:

_Atomic_word  _M_use_count;     // #shared
_Atomic_word  _M_weak_count;    // #weak + (#shared != 0)

为什么计数器是原子的,而指针不是?原子序数有必要吗?有什么例子说明它的必要性吗?

(因为std::shared_ptr不是线程安全的,所以我认为原子计数是不必要的。(

因为std::shared_ptr不是线程安全的,所以我认为原子计数是不必要的

您的前提是无效的,因为std::shared_ptr线程安全的(在某种程度上(。这就是为什么引用计数器是原子计数器。来自cppreference:

为了满足线程安全要求,参考计数器通常使用等效的std::atomic::fetch_add递增使用std::memory_order_relaxed(递减要求更强命令安全地破坏控制块(。

进一步阅读:std::shared_ptr线程安全解释

您关于线程安全性的假设是错误的。std::shared_ptr自C++11(添加它的标准(以来就支持原子操作。请参阅文档。

shared_ptr指向的对象的数据的访问不是自动线程安全的,尽管程序员可以通过互斥锁同步所有访问来实现线程安全。

然而,shared_ptr对共享对象的引用计数是可以在线程之间共享的。如果没有这个,如果一个线程释放了一个引用,而另一个线程进行了引用,就有访问已删除对象的风险。

相关内容

  • 没有找到相关文章

最新更新