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】公众号,未经授权,不得转载。
(加入我的知识星球,免费获取账号,解锁所有文章。)

阅读剩余
THE END