我有一个线程 A,它分配内存并将其分配给一个共享指针。然后该线程生成另外 3 个线程 X、Y 和 Z,并将共享指针的拷贝传递给每个线程。当 X、Y 和 Z 超出范围时,内存将被释放。但是是否有可能 2 个线程 X、Y 在完全相同的时间点超出范围并且引用计数存在竞争条件,因此它不会将其递减 2,而只会递减一次。所以,现在引用计数 newer 下降到 0,所以存在内存泄漏。请注意,X、Y 和 Z 仅读取内存。不写入或重置共享指针。长话短说,引用计数是否存在竞争条件,这会导致内存泄漏吗?
最佳答案
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
的常见用例。您在问题中给出的示例(作用于指向共享对象的拷贝)是线程安全的。
关于c++ - boost 共享指针 : Simultaneous Read Access Across Multiple Threads,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2687017/