c ++子线程终止在main()父线程出口?

时间:2015-05-21 10:10:30

标签: c++ multithreading exit

VS2013,C ++ 我只是发布dll应用程序。其中一个dll app函数通过_beginthread运行线程。 在正常的软件流程中,我使用互斥锁和控制线程。在从主应用程序取消注册dll之前,我等待线程终止并关闭处理程序。

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

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

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

提前感谢您的建议。

3 个答案:

答案 0 :(得分:1)

根据Raymond Chen - 在Windows系统中 - 如果主线程终止,则应用程序会在所有线程结束时挂起。这意味着,没有您的解决方案不起作用,您的线程将在关闭状态下冻结您的应用程序。即使您的线程在退出时被强制终止,它也不会被初始化,并且 - 因为我们在这里谈论MFC线程 - 它会导致您的应用程序泄漏资源,所以非常请不要&# 39;做那个!

答案 1 :(得分:1)

  

如果主要申请人退出,是否有任何风险?

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

  

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

是的!可能是先前的关机压碎了数据结构,现在你甚至无法正确加载数据

  

操作系统有风险吗?

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

  

主要退出后是否所有线程都终止了?

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

答案 2 :(得分:1)

我想说,行为是未定义的。当应用程序终止而没有机会清理时,可能会发生太多事情。 这个SO question可能会提供一些想法。

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

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

看起来即使是操作系统也存在风险

  

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