如何用atomic_store安全置空多线程环境下的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
相关产品推荐
相关产品推荐

