如何使用atomic_store在多线程中将shared_ptr设置为 nullptr

how to use atomic_store set shared_ptr to nullptr in multithread

提问人:QIhao Wu 提问时间:11/2/2023 更新时间:11/8/2023 访问量:51

问:

std::shared_ptr 线程安全中,这样的代码不是线程安全的:

//In thread 1
shared_ptr<myClass> private = global;
...

//In thread 2
global = make_shared<myClass>();

并使用atomic_store和atomic_load是线程安全的


//In thread 1
shared_ptr<myClass> private = atomic_load(&global);
...

//In thread 2
atomic_store(&global, make_shared<myClass>());
...

我尝试使用atomic_store将 ptr 设置为 nullptr,但不允许这样做:

std::atomic_store(&global, nullptr);

我想知道为什么不能安全地将shared_ptr设置为null

C++ 多线程原子 共享 PTR

评论

0赞 BoP 11/2/2023
atomic_store仅适用于原子对象 - 。atomic<T>
1赞 user17732522 11/3/2023
你只需要替换为(你需要 C++20)。shared_ptr<myClass>std::atomic<shared_ptr<myClass>>

答:

0赞 QIhao Wu 11/8/2023 #1

我发现我可以使用 shared_ptr() 代替 nullptr,就像这样

shared_ptr<myClass> private = global;
std::atomic_store(&global, shared_ptr<myClass>());