代码之家  ›  专栏  ›  技术社区  ›  Nikhil

boost共享指针:跨多个线程同时读取访问

  •  6
  • Nikhil  · 技术社区  · 15 年前

    我有一个线程a,它分配内存并将其分配给一个共享指针。然后这个线程生成另外3个线程x、y和z,并将共享指针的副本传递给每个线程。当x、y和z超出范围时,内存被释放。但是,是否有可能两个线程x,y在同一时间点超出范围,并且引用计数存在竞争条件,因此不将其递减2,而只递减一次。所以,现在较新的引用计数下降到0,因此内存泄漏。注意,x,y和z只是在读取内存。不写入或重置共享指针。简而言之,引用计数是否存在竞争条件,这是否会导致内存泄漏?

    5 回复  |  直到 14 年前
        1
  •  2
  •   Potatoswatter    15 年前

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

    要获得绝对无可辩驳的证据,请参阅boost smartptr如何在 boost/smart_ptr/detail/sp_counted_base_gcc_x86.hpp (或者你的平台对应的文件)。

        2
  •  12
  •   Michael Burr    15 年前

    boost::shared_ptr 使用locks(或lock free atomic access)来确保引用计数以原子方式更新(即使在docs页面中没有清除这一点)。如果要编写单线程代码,可以通过定义宏来配置锁的使用 BOOST_SP_DISABLE_THREADS .

    请注意,中的文档示例 http://www.boost.org/doc/libs/1_42_0/libs/smart_ptr/shared_ptr.htm#ThreadSafety 讨论来自不同线程的多个写操作的问题就是讨论作用于同一线程的那些线程 shared_ptr 实例( SelddPPTR 在示例中,对象可能是全局的),而不是不同的 SelddPPTR 复制指向同一对象的对象,这是 SelddPPTR 你在问题中给出的例子(在指向共享对象的副本上操作)是线程安全的。

        3
  •  6
  •   sth    15 年前

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

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

        4
  •  1
  •   Philipp    15 年前

    这个 documentation 说:

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

    因此,如果没有一个线程访问其他线程的指针对象,应该没问题。请看一下文档中的示例,看看哪个与您的案例相关。

        5
  •  -2
  •   Puppy    15 年前

    最好的做法是升级到Tr1或C++0xSaldypTR,而不是Boost多样性。我相信这些必须是线程安全的,这是标准化的。