You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

空std::shared_ptr<void>调用reset()方法是否是无锁的?

std::shared_ptr空实例调用reset的锁特性说明

首先给出明确结论:该操作是否无锁完全依赖于标准库的具体实现,C++语言标准没有对此做强制约束。

  • 先理清reset操作在你给出的场景下的执行逻辑:你调用的是空std::shared_ptr的reset(object),此时shared_ptr没有关联的控制块,操作只需要完成两个核心步骤:为传入的object分配新的控制块(包含引用计数、自定义删除器等元信息),再把shared_ptr内部的裸指针和控制块指针指向对应内存即可。
  • C++标准的要求边界:标准只规定了std::shared_ptr的引用计数更新必须是原子操作,多线程下同时操作多个指向同一对象的不同shared_ptr实例是线程安全的,但从来没有要求reset操作必须是无锁实现。
  • 主流实现的常规表现:

我们常用的libstdc++(GNU配套标准库)、libc++(LLVM配套标准库)中,引用计数本身用无锁原子变量实现,同时空shared_ptr的reset不需要修改原有引用计数,也没有全局锁竞争,因此在这些实现下该操作是无锁的。但这只是实现选择,不是强制要求。
部分嵌入式场景、特殊安全场景下的定制标准库,完全可能在控制块分配、指针赋值流程中引入锁,只要最终符合shared_ptr的语义要求就合规。

  • 额外补充:如果调用reset的shared_ptr原本非空,还需要对原有控制块的引用计数做原子减操作,这一步在主流实现中也是无锁原子操作,但依然不代表所有实现都会这么做。

内容的提问来源于stack exchange,提问作者Juan JuezSarmiento

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.03 01:51:01