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

时间:2010-02-04 06:13:08

标签: windows multithreading winapi visual-c++

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

This blog post表示在这种情况下.NET应用程序不会终止,因为另一个线程仍在运行。这同样适用于本机Win32应用程序吗?

我必须在退出前停止所有线程吗?

5 个答案:

答案 0 :(得分:8)

答案 1 :(得分:3)

缺点是: 要使本机Win32进程终止,必须满足以下两个条件之一:

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

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

c-runtime强加了不同的条件:要使C / C ++应用程序终止,你必须:

  • 从main(或WinMain)返回。
  • call exit()

调用exit()或从main()返回都会导致c-runtime调用ExitProcess()。这是怎样的c& c ++应用程序退出而不清理其线程。我个人认为这是件坏事。

然而,非平凡的Win32进程永远不会终止,因为许多完美的,否则合理的Win32子系统会创建工作线程。 winsock,ole等。并且不提供任何方法使这些线程自发地关闭。

答案 2 :(得分:2)

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

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

如果错了,请纠正我。

答案 3 :(得分:0)

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

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

答案 4 :(得分:-1)

简短回答:是的