C++ c++;在main()父线程退出时终止的子线程?

C++ c++;在main()父线程退出时终止的子线程?,c++,multithreading,exit,C++,Multithreading,Exit,然而,有一种情况是,主应用程序可以在不以正确的方式释放资源的情况下关闭,我的意思是不需要等待子线程终止,也不需要关闭处理程序 如果主应用程序退出,是否存在任何风险?如果在退出后再次运行应用程序和线程,是否存在任何风险? 操作系统有风险吗?所有线程是否在主退出后终止 我知道这是一个“肮脏”的解决方案,但出于某种原因,我无法改变这一点 提前感谢您的建议。根据-在Windows系统中-如果主线程终止,您的应用程序将在所有线程结束时挂起。这意味着,不,您的解决方案将无法工作,您的线程将在关闭状态下冻结您

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

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

我知道这是一个“肮脏”的解决方案,但出于某种原因,我无法改变这一点

提前感谢您的建议。

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

如果主应用程序退出,是否存在任何风险

对!!因为线程可以启动一致性敏感进程

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

对!!以前的关机可能会破坏数据结构,现在甚至无法正确加载数据

操作系统有风险吗

这取决于你的生意。您是否创建了磁盘优化软件,并在紧急关机时移动群集

所有线程是否在主退出后终止


对!!您需要预见到等待线程完成的特殊“连接”代码。

我想说的是,行为是未定义的。当应用程序在没有机会清理的情况下终止时,可能会发生太多事情。 这可能会给我们一些想法

此函数还列出了意外终止线程的一些含义(这可能发生在调用exit时):

  • 如果目标线程拥有一个临界段,则临界段 不会被释放
  • 如果目标线程正在从堆中分配内存,则不会释放堆锁
  • 如果目标线程在终止时正在执行某些kernel32调用,则该线程进程的kernel32状态可能为 前后矛盾
  • 如果目标线程正在操作共享DLL的全局状态,则DLL的状态可能会被破坏,从而影响其他用户 动态链接库的
因此,看起来即使是操作系统也存在风险

线程进程的内核32状态可能不一致


有趣!“应用程序在所有线程结束时挂起”并不意味着它永远挂起。我想,线程也会被运行时终止,不是吗?@ValentinHeinitz我强烈建议阅读关于这个主题的链接文章。。。它澄清了很多我没有时间解释的事情。此外,即使运行时通过调用“TerminateThread()”(或任何其他强制方式)终止线程,线程分配的所有资源也会泄漏,因此这仍然是一个糟糕的解决方案。我知道从外部终止线程的一些未列出的后果:如果线程拥有任何Windows句柄的所有权(文件或命名管道句柄、内核对象、共享内存甚至GUI句柄(可能性较小但可能),这些句柄可能会“泄漏”(保持未释放)。如果有任何同步对象被锁定/发出信号(命名互斥体或事件、信号量等)它可能会被锁定,可能阻止后面的实例运行。如果它在一个延迟文件的中间写,它可能会使文件处于不一致的状态。