gpt4 book ai didi

c++11 - 分配 shared_ptr nullptr 的线程安全吗?

转载 作者:行者123 更新时间:2023-12-04 00:27:16 24 4
gpt4 key购买 nike

假设有一个shared_ptr:

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

在工作线程中:

myPtr = nullptr;

在主线程中:

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

上面的代码线程安全吗?还是主线程可以立即看到新值?

最佳答案

不,这不是线程安全的。

A shared_ptr在线程安全方面表现得像一个内置类型:并发访问不同的对象是可以的,而并发访问相同对象则不行。也就是说,多个线程可能操作不同的shared_ptr。 s 指向他们喜欢的同一个对象。但是一旦你分享了 shared_ptr本身,事情就会变得危险。

使用 atomic non-member functions访问相同的 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> 的特化。并弃用了旧的免费功能。

关于c++11 - 分配 shared_ptr nullptr 的线程安全吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30117975/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com