std::shared_ptr 线程安全方面的思考

发布时间 2023-08-04 18:50:39作者: strive-sun

一直惦记着 std::shared_ptr 线程安全的问题,看了些文章后,又怕过段时间忘记了,遂记录下来

std::shared_ptr 的线程安全问题主要有以下两种:

  • 引用计数的加减操作是否线程安全
  • std::shared_ptr 修改指向时是否线程安全

第一个问题的答案: 是线程安全的,因为是原子操作

注意:

引用计数这一变量的存储,是在堆上的,多个 std::shared_ptr 的对象都指向同一个堆地址

第二个问题的答案:不是线程安全,因为在修改指向时,计数会减一,加减的操作并不是原子的,所以可能存在其他线程也在修改它的指向

这种情况可能会导致计数在操作减一的时候,其内部的指向,已经被其他线程修改过了。引用计数的异常会导致某个管理的对象被提前析构,后续在使用到该数据的时候触发 coredump

例子可以参考高赞答案:C++11 的 shared_ptr 多线程安全?

解决方法很简单,C++20 出了一个原子操作的指向=》std::atomic<std::shared_ptr>

如果没有到 C++20,针对这种问题,可以考虑加锁或者避免在多线程中修改智能指针的指向