线程是否可以安全地分配shared_ptr nullptr?

时间:2015-05-08 07:16:40

标签: c++11 thread-safety shared-ptr

假设有一个shared_ptr:

std::shared_ptr<MyClass> myPtr = std::make_shared(new MyClass());

在工作线程中:

myPtr = nullptr;

在主线程中:

if( myPtr != nullptr )
{
    // do something
}

上面的代码是否安全?或者主线程能否立即看到新值?

1 个答案:

答案 0 :(得分:3)

不,这不是线程安全的。

shared_ptr的行为类似于线程安全的内置类型:对不同对象的并发访问很好,而对相同对象的并发访问则不行。也就是说,多个线程可以操纵指向同一对象的不同shared_ptr。但是一旦你分享shared_ptr本身,事情就会变得危险。

使用atomic non-member functions从多个线程同时访问同一个shared_ptr对象:

std::atomic_store(&myPtr, nullptr);
[...]


if(std::atomic_load(&myPtr) != nullptr) [...]

请注意,只有在访问shared_ptr所有线程仅通过原子函数执行此操作时,此方法才有效。否则你可能仍然会进行数据竞争。