空std::shared_ptr<void>调用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
相关产品推荐
相关产品推荐

