我如何保证我的win32应用程序快速关机?

twk*_*twk 7 c++ winapi multithreading exit

我有一个C++ Win32应用程序,当用户想要关闭应用程序时,它有许多线程可能正在忙着做IO(HTTP调用等).目前,我玩得很好并等待所有线程结束然后返回main.有时,这比我想要的时间更长,事实上,当我可以退出时让用户等待似乎毫无意义.但是,如果我继续前进并返回main,我可能会因为析构函数开始被调用而崩溃,而仍有线程使用这些对象.

因此,认识到在一个理想的,柏拉图式的美德世界中,最好的办法是等待所有线程退出然后干净地关闭,下一个最好的真实解决方案是什么?简单地让线程退出更快可能不是一种选择.目标是尽可能快地使进程失效,例如,可以在其上安装新版本.我正在做的唯一磁盘IO是在事务性数据库中,所以我并不十分担心拔掉插件.

Len*_*ate 7

使用重叠IO,这样您就可以始终控制处理I/O的线程,并且可以随时停止它们; 您要么让他们等待IOCP并且可以向其发布应用程序级别的关闭代码,或者您可以等待OVERLAPPED结构中的事件并等待"所有线程请立即关闭"事件.

总之,请避免阻止您无法取消的呼叫.

如果你不能和你陷入阻塞套接字调用做IO那么你总是可以从线程中关闭套接字,该线程决定是时候关闭并让正在做IO的线程总是检查'现在关闭'重试之前的事件......


Rod*_*ddy 5

我使用基于异常的技术,在许多Win32应用程序中对我来说非常好用.

为了终止一个线程,我用来QueueUserAPC()将一个调用队列一个抛出异常的函数.但是,抛出的异常不是从"异常"类型派生的,因此只能由我的线程的包装程序捕获.

其优点如下:

  • 您的线程中不需要特殊代码使其"可停止" - 只要它进入可警告的等待状态,它就会运行APC功能.
  • 当异常在堆栈中运行时,所有析构函数都会被调用,因此您的线程会干净地退出.

你需要注意的事项:

  • 做任何事catch (...)都会吃掉你的例外.用户代码应始终使用catch(const Exception &e)或类似!
  • 确保您的I/O和延迟以"可警告"的方式完成.例如,这意味着调用sleepex(N, true)而不是sleep(N).
  • CPU绑定线程需要sleepex(0,true)偶尔调用以检查终止.

您还可以"保护"代码区域,以防止在关键部分中终止任务.


The*_*urf 2

最好的方法:在应用程序运行时完成工作,在关闭时不执行任何操作(或几乎不执行任何操作)(也适用于启动)。如果您坚持这种模式,那么当关闭请求到来时,您可以立即拆除线程(而不是“友好”地对待它),而不必担心仍然需要完成的工作。

在您的具体情况下,如果您在那里进行本地工作,您可能需要等待 IO 完成(至少是写入)。HTTP 请求等您可能可以直接放弃/关闭(再次强调,除非您正在编写某些内容)。但是,如果您在关闭期间进行写入并等待关闭,那么您可能需要通知用户这一点,而不是让您的进程在结束时看起来挂起。