是否有必要在退出Win32应用程序之前明确停止所有线程?

我有一个Win32本地VC ++应用程序,进入WinMain()启动一个单独的线程,然后做一些有用的工作,而其他线程正在运行,然后只是退出WinMain() – 另一个线程是不明确停止。

这个博客文章说,在这种情况下,.NET应用程序不会终止,因为另一个线程仍在运行。 这同样适用于本机Win32应用程序吗?

在退出之前是否必须停止所有线程?

是的,否则你的应用程序可能会挂起。 我推荐阅读Raymond Chen关于这个主题的优秀博客文章:

  • 流程退出的老式理论
  • 快速了解Windows XP上的进程如何退出
  • 我对Windows XP上的进程如何退出缺乏了解,这迫使我们回想起安全补丁
  • 在进程终止期间,闸门现在被通电

它的缺点是:对于本机Win32进程终止,必须满足两个条件之一:

  • 有人调用ExitProcess或TerminateProcess。
  • 所有的线程退出(通过从他们的ThreadProc返回(包括由Windows创建的第一个线程的WinMainEntryPoint)),关闭(通过调用ExitThread)或终止(某人调用TerminateThread)。

(第一个条件实际上与第二条相同:ExitProcess和TerminateProcess,作为它们清理的一部分,都在进程中的每个线程上调用TerminateThread)。

c运行时会施加不同的条件:要使C / C ++应用程序终止,您必须:

  • 从主(或WinMain)返回。
  • 调用exit()

调用exit()或从main()返回都会导致c-runtime调用ExitProcess()。 C&C ++应用程序如何在不清除线程的情况下退出。 我个人认为这是一件坏事。

但是,非微不足道的Win32进程永远不能终止,因为许多完美的,合理的Win32子系统创建工作线程。 winsock,ole等。而且不要提供任何方式来使这些线程自发地关闭。

不,WinMain返回时,进程将被终止,这意味着进程产生的所有线程应该被终止,尽管它们可能没有被正常关闭。

但是, 主线程在其他线程正在运行时可能会终止,从而导致应用程序仍在运行 如果您在WinMain中调用了ExitThread (不是exitExitProcess ),并且有正在运行的线程(最终由主线程创建),那么您可能会观察到此行为。 尽管如此,只要在WinMain中返回就会调用ExitProcess ,这意味着所有的线程都应该被终止。

纠正我,如果它是错的。

我想你可以先关闭所有的窗口(这样用户不会看到你的应用程序),然后设置退出标志,你的线程应该定期检查标志,一旦发现设置,线程应该返回。

设置标志后,主线程可以调用:: WaitForSingleObject()或:: WaitForMultipleObjects()一段时间(比如三秒),如果线程没有返回,只需要通过:: TerminateThread()来终止它们。

简短的回答:是的