【问题标题】:How to guarantee termination of detached C++ thread?如何保证分离的 C++ 线程的终止?
【发布时间】:2021-02-14 08:21:37
【问题描述】:

在我看来,在我看来,没有可移植的方法来保证分离的std::thread 在主线程完成执行后不会导致内存泄漏甚至未定义的行为。显然,一旦分离就无法加入,似乎没有一种机制来检测分离的线程是否从主线程中退出,并且 STL 没有提供pthread_exit 的类似物。

在我看来,这意味着一旦我分离一个线程,我基本上必须祈祷它在主线程从main 返回之前完成执行,否则可能会发生坏事。它是否正确?还是我错过了什么?

【问题讨论】:

  • 您确定需要分离的thread吗?
  • 您使用的是哪个 c++ 标准?
  • @Iman:C++11,我已经编辑了这个问题。是的,我敢肯定,我知道这是不典型的,但我的代码中有一部分我真的不能同步等待线程完成执行。这在 99% 的情况下都不是问题,但有时线程会继续执行直到 main 结束,此时我不知道如何处理它。
  • 在 main() 结束时对 std::condition_variable 使用等待,当它完成时您在线程代码中通知它。线程对象是否仍然附加并不重要。
  • @HansPassant:这似乎是明智的,我会试试看。

标签: c++ c++11 concurrency


【解决方案1】:

保证分离的 std::thread 不会导致内存泄漏

当 main 完成后,内存泄漏通常不是问题,因为程序无论如何都会终止。

主线程完成执行后甚至是未定义的行为

不要触及线程中的全局状态,也不要触及 main 中的任何自动变量。或者如果你这样做了,那就不要分离。

在我看来,这意味着一旦我分离了一个线程,我基本上必须祈祷它已经完成执行

不完全是。您不一定需要关心线程整理。如果您确实需要关心,请不要分离该线程。

如何保证分离的C++线程终止?

你不能。最多,您可以通过在 main 中等待条件变量并在线程末尾设置变量来保证线程已完成其工作。在大多数情况下,这是一种重新实现连接的复杂方法。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-11-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-04-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多