c++ - boost 共享指针 : Simultaneous Read Access Across Multiple Threads

标签 c++ multithreading boost shared-ptr

我有一个线程 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/

相关文章:

c# - 为什么任务列表中只有随机的几个任务运行完成?

multithreading - 是否应该在长时间运行的进程中留下空闲线程?

c++ - 使用 boost::iterator_facade 的优点和缺点是什么?

c++ - 为什么会这样? operator= 和复制构造函数

c++ - 无法在动态链接库中找到过程入口点 __gxx_personality_v0

c++ - C++ 中从同一命名空间中的类继承的问题

java - 以线程安全的方式缓存preparestatement?

c++ - Boost point_circle 以奇怪的形状出现

c++ - boost 几何 : legacy objects adaptation

c# - 将字节数组从 C++ 调用到 C#