【问题标题】:Do child threads exit when the parent thread terminates父线程终止时子线程是否退出
【发布时间】:2011-06-07 16:30:11
【问题描述】:

我在 Visual Studio C++ 中使用调用 beginthreadex、endthreadex 进行了一些多线程编程。

我创建了一个子线程thread1。子线程运行在一个永远不会退出的函数上,因为它有一个无限循环。现在如果父线程因错误终止或成功完成,子线程是否也退出?我的疑问是-即使在主程序退出后,是否存在子线程仍然存在的情况?

对于linux这种情况应该怎么办?

【问题讨论】:

  • 这是一个密切相关的问题:stackoverflow.com/questions/2197699/…
  • 帖子的答案相互矛盾。
  • @user97642 从您的角度来看,存在哪些冲突?在我看来,答案都是相似的。

标签: c++ windows


【解决方案1】:

由于C和C++mandate that returning from the main function kills all running threads,是的,进程应该没了。由于该行为是由运行时完成的,因此 Linux 上的情况应该是相同的。

【讨论】:

  • 您提供的链接没有说明杀死(!)所有线程的语言要求。它只引用了一个要求,即从 main 返回等同于调用 exit()。
  • 链接现在失效了。你能提供一个更新的吗
【解决方案2】:

一旦你的进程死亡,所有资源都会被释放(内存、文件和线程)

正确的做法:调用beginthread时,将返回的句柄保留在父线程中,离开程序前调用WaitForObject(我们加入父线程与子线程)。

父线程将阻塞直到子线程完成。如果您的子线程有一个无限循环,您可以定义一个“中断点”,并检查您是否应该离开。例如,使用共享布尔变量。更多信息请查看Interrupt Politely

【讨论】:

  • 当程序正常终止时,您的情况很好,即它到达 main() 的末尾。但是在主线程或父线程中有很多地方调用了exit()。那么 exit() 会杀死所有线程吗?
  • @user97642 如果主线程退出然后所有其他线程停止
  • 请注意,对信号量、句柄等的无限等待可能会导致您的进程在 Windows 和 Linux 中成为僵尸。否则就像其他人所说的那样;当主线程死亡时,所有其他线程都被杀死。
【解决方案3】:

线程之间没有父/子关系。如果线程A创建线程B,然后线程A终止,那么线程B将继续执行。

这种情况的例外是当主线程(即运行main() 函数的线程)终止时。发生这种情况时,进程终止并且所有其他线程停止。

【讨论】:

  • 两个例外。如果任何线程调用exit,则所有线程终止。
  • 我还想补充一点,如果main存在而不在正在运行的线程上调用detach,则会抛出异常。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-03-31
  • 2013-05-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-03-17
相关资源
最近更新 更多