_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
对共享对象的引用计数是可以在线程之间共享的。如果没有这个,如果一个线程释放了一个引用,而另一个线程进行了引用,就有访问已删除对象的风险。