c++子线程在main()父线程退出时终止

c++ child threads terminating on main() parent thread exit?

本文关键字:线程 退出 终止 main c++      更新时间:2023-10-16

VS2013, c++我只是释放dll应用程序。其中一个dll应用程序函数运行线程_beginthread。在正常的软件流程中,我使用互斥锁和控制线程。在从主应用程序注销dll之前,我等待线程终止并关闭处理程序。

然而,有一种情况下,主应用程序可以在没有正确释放资源的情况下关闭,我的意思是不等待子线程终止,也不关闭处理程序。

主应用程序强行退出是否有风险?如果我在退出后再次运行应用程序和线程是否有任何风险?操作系统有风险吗?所有线程都在主退出后终止吗?

我知道这是"肮脏"的解决方案,但由于某种原因,我不能改变它。

提前感谢您的建议

根据Raymond Chen的说法——在Windows系统中——如果主线程终止,你的应用程序会挂起,而所有的线程也会结束。这意味着,你的解决方案不会工作,你的线程将冻结你的应用程序在关闭状态。此外,即使你的线程在退出时被强制终止,它也不会被初始化,而且——因为我们在这里谈论的是MFC线程——它会导致你的应用程序泄漏资源,所以非常请不要这样做!

主应用程序强行退出是否有风险?

是的!因为线程可以启动一致性敏感进程。

如果我在退出后再次运行应用程序和线程是否有任何风险?

是的!可能是之前的关闭破坏了数据结构,现在你甚至不能正确加载数据

对OS有风险吗?

这取决于你的业务。可能您创建了一个软盘优化,并且在紧急关闭时正在移动集群?

所有线程都在主退出后终止吗?

是的!你需要预见特殊的"join"代码来等待线程的完成。

我会说,行为是未定义的。当应用程序被终止而没有机会进行清理时,可能会发生太多事情。这个问题可能会给我们一些启发。

这篇MS文章描述了TerminateThread函数,还列出了意外终止线程的一些含义(这可能发生在调用exit时):

  • 如果目标线程拥有临界区,则临界区将不会被释放。
  • 如果目标线程正在从堆中分配内存,堆锁将不会被释放。
  • 如果目标线程在终止时正在执行某些kernel32调用,则该线程进程的kernel32状态可能为不一致。如果目标线程正在操作共享DLL的全局状态,那么DLL的状态可能会被破坏,从而影响其他用户

看起来对OS来说也有风险

线程进程的kernel32状态可能不一致