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

如何用atomic_store安全置空多线程环境下的std::shared_ptr?

std::shared_ptr置空的原子操作问题解析

首先明确一个前提:直接对全局std::shared_ptr进行读写操作是非线程安全的,比如下面的代码:

// 线程1
shared_ptr<myClass> private = global;
...

// 线程2
global = make_shared<myClass>();

而使用std::atomic_load和std::atomic_store对std::shared_ptr进行操作时,就能保证线程安全:

// 线程1
shared_ptr<myClass> private = atomic_load(&global);
...

// 线程2
atomic_store(&global, make_shared<myClass>());
...

但如果尝试用atomic_store直接将std::shared_ptr置空,比如下面的写法会编译报错:

std::atomic_store(&global, nullptr);

原因分析

std::atomic_store针对std::shared_ptr的重载版本,要求第二个参数的类型必须是std::shared_ptr<T>(或可隐式转换为该类型的对象),而nullptr属于std::nullptr_t类型,无法直接隐式转换为std::shared_ptr<T>。

要实现线程安全的置空操作,需要显式构造一个空的std::shared_ptr作为参数,正确写法如下:

std::atomic_store(&global, std::shared_ptr<myClass>());
// 或者更简洁的写法
std::atomic_store(&global, {});

本质上,针对std::shared_ptr的原子操作接口是强类型的,必须传递同类型的对象,不能直接用裸空指针或nullptr替代。

内容的提问来源于stack exchange,提问作者QIhao Wu

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.07 09:04:54