1.29、shared_ptr线程安全吗?
shared_ptr的线程安全本质
引用计数的线程安全
std::shared_ptr
内部维护的引用计数是线程安全的。它通过原子操作(std::atomic
)来保证对引用计数的增减在多线程环境下不会出现竞态条件,从而确保资源的正确释放和销毁只发生一次。
对象访问的线程安全
但shared_ptr
并不保证其所管理的对象本身是线程安全的。多个线程同时访问shared_ptr
指向的对象时,如果对象本身没有设计为线程安全,那么必须由用户自行加锁或采取其他同步措施来保证访问安全。
不同shared_ptr实例的并发操作
多个线程可以安全地同时读写不同的shared_ptr
实例,即使它们共享同一个对象的所有权。这意味着复制、赋值等操作在不同线程中对不同shared_ptr
对象是安全的。
同一shared_ptr实例的并发访问
如果多个线程访问同一个shared_ptr
实例,且至少有一个线程执行写操作(非const
成员函数),则需要用户自行保证同步,否则可能发生数据竞争。C++20引入了std::atomic<shared_ptr>
,用于安全地管理单个shared_ptr
实例的并发访问,但该特性在部分编译器中支持有限。
总结
方面 | 线程安全情况 | 说明 |
引用计数管理 | 线程安全 | 通过原子操作保证引用计数正确更新和资源唯一释放 |
管理对象访问 | 不保证线程安全 | 对象本身线程安全需用户保证,如使用互斥锁保护访问 |
不同shared_ptr实例 | 线程安全 | 不同线程操作不同shared_ptr 实例安全 |
同一shared_ptr实例 | 非线程安全(除非使用std::atomic) | 多线程访问同一实例需同步,否则可能产生数据竞争 |
本文首发于【讳疾忌医-note】公众号,未经授权,不得转载。
(加入我的知识星球,免费获取账号,解锁所有文章。)
阅读剩余
版权声明:
作者:讳疾忌医-note
链接:https://www.1217zy.vip/archives/1270
文章版权归作者所有,未经允许请勿转载。
THE END