复制shared_ptr线程安全问题
shared_ptr文档中有这么一段:
shared_ptr objects offer the same level of thread safety as built-in types. A shared_ptr instance can be
"read " (accessed using only const operations) simultaneously by multiple threads. Different shared_ptr instances can be
"written to " (accessed using mutable operations such as operator= or reset) simultaneosly by multiple threads (even when these instances are copies, and share the same reference count underneath.)
Any other simultaneous accesses result in undefined behavior.
这意味着复制使用没有问题,但我后来又发现如下问题:
shared_ptr在传参以及operator=操作时会对记数器进行增加,但是记数器本身不是线程安全,这就非常费解了。
难道在shared_ptr当参数传递时必须要用到weak_ptr来引用?
...全文
相关推荐
test_share_ptr
```cppstd::shared_ptr<int> ptr3(ptr); // 复制构造,ptr和ptr3共享对象```3. 解引用和成员访问:智能指针可以像普通指针一样解引用并访问成员。
C++ 智能指针实现(基于 shared-ptr 和 weak-ptr 的内存管理技术)
当引用计数降至0时,表明没有任何shared_ptr指向该对象,此时对象将被自动删除,同时它所占用的内存资源也会被释放。在实现shared_ptr时,需要考虑线程安全问题。
C++智能指针详解[项目代码]
为了解决这个问题,引入了weak_ptr作为shared_ptr的补充,它可以观察shared_ptr指向的对象,但不增加引用计数,因此不会阻止shared_ptr所指向的对象被删除。
C++11智能指针详解[项目代码]
然而,shared_ptr的引用计数机制也带来了一定的开销,并且需要考虑线程安全问题,特别是在多线程环境下。
C++智能指针解析[源码]
它不拥有它所指向的对象,而是提供一种访问shared_ptr管理的资源的手段,同时不增加引用计数。这解决了由于shared_ptr之间的循环引用而无法释放资源的问题。


