父线程离开其块后分离的 std::thread 的情况

Posted

技术标签:

【中文标题】父线程离开其块后分离的 std::thread 的情况【英文标题】:Situation of detached std::thread after parrent thread left its block 【发布时间】:2017-10-19 07:12:04 【问题描述】:

我已经搜索过,但我找不到这个问题的确切答案。 例如,如果我们有这样的代码块:


  std::thread thread_1(.....);
  thread_1.detach();
  ...

当 thread_1 仍然工作时,父线程离开此代码块后会发生什么。

【问题讨论】:

恕我直言,在documentation 中,一切都很清楚。例子正是如此。 @megabyte1024 是的,我看到了那个例子,但我不能确定,因为在 main() 编译它自己的块之后其他线程会发生什么也有类似的歧义。我们能否确定它是否可以像该示例中那样运行任何操作系统和编译器? 没有人可以确定任何操作系统和/或任何编译器都按照标准规定工作。但这是执行的问题,而不是标准的问题。 会发生什么?执行继续。线程是分离的,因此您的程序与其进行的任何交互都必须通过共享变量来实现。 【参考方案1】:

案例 1:我在一个非常糟糕的操作系统上运行它,或者可能非常原始,然后你已经 分离 @ 987654321@ 来自main 线程,因此它在main 线程的独立 中工作。因此,即使主线程退出,只要不依赖于 global 范围内的任何变量,它就会继续运行,它将成为流浪线程。

案例 2: 这是在 现代 操作系统上运行的,我们可以说它的行为与 案例 1 中的相同,但现代操作系统在看到 寡妇 线程时会立即 杀死 并清理它,释放 资源 被它捕获

希望对您有所帮助,如果不正确,请在下面的 cmets 中提出更正建议...谢谢

【讨论】:

以上是关于父线程离开其块后分离的 std::thread 的情况的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 QThread 创建一个分离的线程,就像在 std::thread 中一样

分离的 std::thread 终止后是不是需要删除?

如何知道分离的 std::thread 是不是已完成执行?

在处理异常后阻止线程在分离时调用std :: terminate()

如何终止或停止 C++ 中的分离线程?

07-SV线程以及线程间的通信