c++子线程在main()父线程退出时终止
c++ child threads terminating on main() parent thread exit?
VS2013, c++我只是释放dll应用程序。其中一个dll应用程序函数运行线程_beginthread。在正常的软件流程中,我使用互斥锁和控制线程。在从主应用程序注销dll之前,我等待线程终止并关闭处理程序。
然而,有一种情况下,主应用程序可以在没有正确释放资源的情况下关闭,我的意思是不等待子线程终止,也不关闭处理程序。
主应用程序强行退出是否有风险?如果我在退出后再次运行应用程序和线程是否有任何风险?操作系统有风险吗?所有线程都在主退出后终止吗?
我知道这是"肮脏"的解决方案,但由于某种原因,我不能改变它。
提前感谢您的建议
根据Raymond Chen的说法——在Windows系统中——如果主线程终止,你的应用程序会挂起,而所有的线程也会结束。这意味着,你的解决方案不会工作,你的线程将冻结你的应用程序在关闭状态。此外,即使你的线程在退出时被强制终止,它也不会被初始化,而且——因为我们在这里谈论的是MFC线程——它会导致你的应用程序泄漏资源,所以非常请不要这样做!
主应用程序强行退出是否有风险?
是的!因为线程可以启动一致性敏感进程。
如果我在退出后再次运行应用程序和线程是否有任何风险?
是的!可能是之前的关闭破坏了数据结构,现在你甚至不能正确加载数据
对OS有风险吗?
这取决于你的业务。可能您创建了一个软盘优化,并且在紧急关闭时正在移动集群?
所有线程都在主退出后终止吗?
是的!你需要预见特殊的"join"代码来等待线程的完成。
我会说,行为是未定义的。当应用程序被终止而没有机会进行清理时,可能会发生太多事情。这个问题可能会给我们一些启发。
这篇MS文章描述了TerminateThread函数,还列出了意外终止线程的一些含义(这可能发生在调用exit时):
- 如果目标线程拥有临界区,则临界区将不会被释放。
- 如果目标线程正在从堆中分配内存,堆锁将不会被释放。 如果目标线程在终止时正在执行某些kernel32调用,则该线程进程的kernel32状态可能为不一致。如果目标线程正在操作共享DLL的全局状态,那么DLL的状态可能会被破坏,从而影响其他用户
看起来对OS来说也有风险
线程进程的kernel32状态可能不一致
- std::async 如果线程是从 DLL 创建的,则会阻止进程退出?
- 在线程退出之前,线程分配的内存块是否与线程本身具有相同的相关性?
- STD ::线程不会退出
- C++线程退出循环条件
- gdb 中的线程 0x7fffc57fa700 (LWP 31671) 退出] 是什么意思?
- 如何使用工作线程正确退出Qt应用程序
- Boost.Asio:由于线程退出或应用程序请求,I/O 操作已中止
- 当子线程退出时,如何通知父线程
- 线程退出时通知Waiters
- 线程退出时 DLL 中的 MFC 无模式对话框被销毁
- prctl(PR_SET_PDEATHSIG, SIGNAL) 在父线程退出时调用,而不是在父进程退出时调用
- 通知线程退出
- 如何在 Windows 上的线程退出时释放 TLS 插槽中的对象
- 将参数从主线程传递到线程.当线程退出时,主线程将重置为0.为什么?
- 在没有c++11的情况下,使用boost标记线程退出的正确方法是什么
- 异步ReadDirectoryChangesW调用阻止线程退出
- 如何检测线程退出窗口的原因
- 希望线程在父线程退出时不会死亡- linux
- 线程退出时的清理
- c++子线程在main()父线程退出时终止