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

一直惦记着 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,针对这种问题,可以考虑加锁或者避免在多线程中修改智能指针的指向

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值