提升共享指针:跨多个线程同时读取访问权限

Nik*_*hil 6 c++ multithreading boost shared-ptr

我有一个线程A,它分配内存并将其分配给共享指针.然后,该线程产生3个其他线程X,Y和Z,并将共享指针的副本传递给每个线程.当X,Y和Z超出范围时,释放内存.但有一种可能性,即2个线程X,Y走出去的范围在时间完全相同的点,并有一个由2递减到对引用计数的竞争条件,而不是如此,它只被递减一次.所以,现在引用计数更新为0,因此存在内存泄漏.请注意,X,Y和Z仅读取内存.不写入或重置共享指针.长话短说,引用计数是否存在竞争条件,是否会导致内存泄漏?

Mic*_*urr 12

boost::shared_ptr使用锁(或无锁原子访问)来确保引用计数以原子方式更新(即使从文档页面中不清楚).如果您通过定义宏来编写单线程代码,则可以配置锁的使用BOOST_SP_DISABLE_THREADS.

请注意,http://www.boost.org/doc/libs/1_42_0/libs/smart_ptr/shared_ptr.htm#ThreadSafety中讨论来自不同线程的多次写入问题的文档示例正在讨论作用于相同shared_ptr实例的线程(该shared_ptr对象可能是在实施例中全局),而不是不同shared_ptr的是指向同一个对象,这是通常的使用情况拷贝shared_ptr的.您在问题中提供的示例(作用于指向共享对象的副本)是线程安全的.


sth*_*sth 6

不,根据文档,这些问题不会发生:

不同shared_ptr 实例可以"写入" simultaneosly由多个线程(使用可变操作,例如操作者访问=或复位)(即使当这些实例是副本,和下方共享相同的引用计数.)


Pot*_*ter 2

其他几个人已经提供了文档链接,解释说这是安全的。

要获得绝对无可辩驳的证据,请参阅 Boost Smartptr 实际上如何从头开始实现自己的互斥体boost/smart_ptr/detail/sp_counted_base_gcc_x86.hpp(或您平台的相应文件)。