VS2013, c++我只是释放dll应用程序。其中一个dll应用程序函数运行线程_beginthread。在正常的软件流程中,我使用互斥锁和控制线程。在从主应用程序注销dll之前,我等待线程终止并关闭处理程序。
然而,有一种情况下,主应用程序可以在没有正确释放资源的情况下关闭,我的意思是不等待子线程终止,也不关闭处理程序。
主应用程序强行退出是否有风险?如果我在退出后再次运行应用程序和线程是否有任何风险?操作系统有风险吗?所有线程都在主退出后终止吗?
我知道这是"肮脏"的解决方案,但由于某种原因,我不能改变它。
提前感谢您的建议
根据Raymond Chen的说法——在Windows系统中——如果主线程终止,你的应用程序会挂起,而所有的线程也会结束。这意味着,你的解决方案不会工作,你的线程将冻结你的应用程序在关闭状态。此外,即使你的线程在退出时被强制终止,它也不会被初始化,而且——因为我们在这里谈论的是MFC线程——它会导致你的应用程序泄漏资源,所以非常请不要这样做!
主应用程序强行退出是否有风险?
是的!因为线程可以启动一致性敏感进程。
如果我在退出后再次运行应用程序和线程是否有任何风险?
是的!可能是之前的关闭破坏了数据结构,现在你甚至不能正确加载数据
对OS有风险吗?
这取决于你的业务。可能您创建了一个软盘优化,并且在紧急关闭时正在移动集群?
所有线程都在主退出后终止吗?
是的!你需要预见特殊的"join"代码来等待线程的完成。
我会说,行为是未定义的。当应用程序被终止而没有机会进行清理时,可能会发生太多事情。这个问题可能会给我们一些启发。
这篇MS文章描述了TerminateThread函数,还列出了意外终止线程的一些含义(这可能发生在调用exit时):
- 如果目标线程拥有临界区,则临界区将不会被释放。
- 如果目标线程正在从堆中分配内存,堆锁将不会被释放。 如果目标线程在终止时正在执行某些kernel32调用,则该线程进程的kernel32状态可能为不一致。如果目标线程正在操作共享DLL的全局状态,那么DLL的状态可能会被破坏,从而影响其他用户
看起来对OS来说也有风险
线程进程的kernel32状态可能不一致