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

2021-12-18 00:00:00 multithreading winapi exit c++

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

I've got a C++ Win32 application that has a number of threads that might be busy doing IO (HTTP calls, etc) when the user wants to shutdown the application. Currently, I play nicely and wait for all the threads to end before returning from main. Sometimes, this takes longer than I would like and indeed, it seems kind of pointless to make the user wait when I could just exit. However, if I just go ahead and return from main, I'm likely to get crashes as destructors start getting called while there are still threads using the objects.

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

So, recognizing that in an ideal, platonic world of virtue, the best thing to do would be to wait for all the threads to exit and then shutdown cleanly, what is the next best real world solution? Simply making the threads exit faster may not be an option. The goal is to get the process dead as quickly as possible so that, for example, a new version can be installed over it. The only disk IO I'm doing is in a transactional db, so I'm not terribly concerned about pulling the plug on that.

推荐答案

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

Use overlapped IO so that you're always in control of the threads that are dealing with your I/O and can always stop them at any point; you either have them waiting on an IOCP and can post an application level shutdown code to it, OR you can wait on the event in your OVERLAPPED structure AND wait on your 'all threads please shutdown now' event as well.

总而言之,避免阻塞无法取消的呼叫.

In summary, avoid blocking calls that you can't cancel.

如果你不能,并且你在执行 IO 的阻塞套接字调用中被卡住,那么你总是可以从已经决定是时候关闭的线程关闭套接字并让执行 IO 的线程总是检查重试之前的立即关闭"事件...

If you can't and you're stuck in a blocking socket call doing IO then you could always just close the socket from the thread that has decided that it's time to shut down and have the thread that's doing IO always check the 'shutdown now' event before retrying...

相关文章