gpt4 book ai didi

c++ - std::shared_ptr 线程安全

转载 作者:行者123 更新时间:2023-12-04 08:19:02 25 4
gpt4 key购买 nike

在多线程程序中使用共享指针 (std::shared_ptr) 是否安全?
我不考虑对共享指针拥有的数据进行读/写访问,而是考虑共享指针本身。

我知道某些实现(例如 MSDN)确实提供了这种额外的保证;但我想了解这是否由标准保证并且因此是可移植的。

#include <thread>
#include <memory>
#include <iostream>

void function_to_run_thread(std::shared_ptr<int> x)
{
std::cout << x << "\n";
}
// Shared pointer goes out of scope.
// Is its destruction here guaranteed to happen only once?
// Or is this a "Data Race" situation that is UB?

int main()
{
std::thread threads[2];

{
// A new scope
// So that the shared_ptr in this scope has the
// potential to go out of scope before the threads have executed.
// So leaving the shared_ptr in the scope of the threads only.
std::shared_ptr<int> data = std::make_shared<int>(5);

// Create workers.
threads[0] = std::thread(function_to_run_thread, data);
threads[1] = std::thread(function_to_run_thread, data);
}
threads[0].join();
threads[1].join();
}

最受欢迎的标准中任何部分的链接。

如果人们能引用主要的实现,我会很高兴,这样我们就可以认为它对大多数普通开发人员是可移植的。

  • MSDN:检查。线程安全。
  • G++: ?
  • clang :?

我会考虑那些主要的实现,但很乐意考虑其他实现。

最佳答案

引用latest draft :

For purposes of determining the presence of a data race, member functions shall access and modify only the shared_ptr and weak_ptr objects themselves and not objects they refer to. Changes in use_count() do not reflect modifications that can introduce data races.

所以,这有很多需要理解的地方。第一句话谈到成员函数不访问指针对象,即访问指针对象不是线程安全的。

不过,接下来就是第二句了。实际上,这会强制任何会更改 use_count() 的操作(例如复制构造、赋值、销毁、调用 reset)成为线程安全的 - 但仅限于它们正在影响 use_count()

这是有道理的:复制相同的 std::shared_ptr(或销毁相同的 std::shared_ptr)的不同线程不得导致关于所有权的数据竞争指针。 use_count() 的内部值必须同步。

我检查了一下,N3337 中也出现了这个确切的措辞,第 20.7.2.2 节第 4 段,所以可以肯定地说,自从在 C++11 中引入 std::shared_ptr 以来,这个要求就一直存在(并且不是后来引入的) .

关于c++ - std::shared_ptr 线程安全,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65584420/

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