假设有一个shared_ptr:
std::shared_ptr<MyClass> myPtr = std::make_shared(new MyClass());
在工作线程中:
myPtr = nullptr;
在主线程中:
if( myPtr != nullptr )
{
// do something
}
线程上方的代码安全吗?还是主线程可以立即看到新值?
不,这不是线程安全的。
shared_ptr
关于线程安全,A的行为类似于内置类型:并发访问不同的对象很好,而并发访问同一对象则不是。也就是说,多个线程可以shared_ptr
按自己的喜好操纵指向同一对象的不同s。但是,一旦分享shared_ptr
自己,事情就会变得很危险。
使用原子非成员函数可以shared_ptr
同时从多个线程访问同一对象:
// atomically set myPtr to nullptr
std::atomic_store(&myPtr, std::shared_ptr<MyClass>{});
[...]
// atomically check the current value of myPtr
if(std::atomic_load(&myPtr) != nullptr) [...]
请注意,这仅在所有shared_ptr
通过原子函数访问唯一线程的线程都起作用的情况下才有效。否则,您可能仍然会进行数据争夺。为了使此限制在源代码中更明确,C ++ 20引入std::atomic<std::shared_ptr>
了旧自由函数的专用化,并且不赞成使用。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句