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

时间:2010-04-21 22:30:23

标签: c++ multithreading boost shared-ptr

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

5 个答案:

答案 0 :(得分: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的常用用例。您在问题中提供的示例(作用于指向共享对象的副本)是线程安全的。

答案 1 :(得分:6)

不,根据the documentation,这些问题不会发生:

  

不同的shared_ptr实例可以被多个线程同时“写入”(使用诸如operator =或reset之类的可变操作访问)(即使这些实例是副本,并且在下面共享相同的引用计数。)

答案 2 :(得分:2)

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

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

答案 3 :(得分:1)

documentation说:

  

不同的shared_ptr实例可以被多个线程同时“写入”(使用诸如operator =或reset之类的可变操作访问)(即使这些实例是副本,并在下面共享相同的引用计数。)

因此,如果没有任何线程访问其他线程的指针对象,那么应该没问题。请查看文档中的示例,并查看哪些示例与您的案例相关。

答案 4 :(得分:-2)

最好的办法是升级到TR1或C ++ 0x shared_ptr,而不是Boost变种。我认为标准化必须是线程安全的。