【问题标题】:boost::threads - how to do graceful shutdown?boost::threads - 如何优雅关机?
【发布时间】:2025-12-29 07:10:07
【问题描述】:

我正在尝试通过使用 boost:threads 而不是我们自己的 Win32 线程包装器来提高 C++ 应用程序的可移植性,而优雅的线程终止问题(再次)引起了它的丑陋。

在纯 win32 上,我通过使用 QueueUserAPC 来“中断”线程以引发“thread_interrupt”异常,该异常会导致所有 RAII 对象在退出时被清理,as described here。任何“可提醒”的操作系统功能都可以通过这种方式中断,因此互斥等待、睡眠、串行和套接字 I/O 等都是可能的中断点。

但是,boost:mutexes 等在 win32 上的 QueueUserAPC 不是“可提醒的” - 它们调用诸如 Sleep(n) 而不是 SleepEx(n, true)) 之类的东西

Boost 线程确实有一个“中断”机制(类似地涉及抛出异常),但它似乎有一个缺点,即只有 boost::thread 调用是可中断的,因此第三方套接字库(例如)不能被打断了。

怎么办?我可以在本地修改增强源以使其可中断,但这感觉是一个糟糕的选择,我认为这对可移植性没有帮助。重新设计整个应用程序以消除对正常线程关闭的要求是一条同样没有吸引力的路线...

【问题讨论】:

  • 只是想知道,优雅关机是什么意思?因为如果你问我,中断更像是最后的手段,非常丑陋的关闭。
  • @KillianDS - 通过正常关闭,我的意思是对象在退出时被正确破坏。升压“中断”会引发异常以实现此目的。非正常关闭不会破坏对象,因此会泄漏资源。
  • 优雅中断不为此提供接口的第三方库是不可能的。
  • @Basilevs。不正确-我已经工作多年了。请参阅我对“链接”问题的回答。我知道它可能不适用于所有图书馆,但它确实适用于许多图书馆。
  • 在链接的问题事务数据库中提供了这样的接口。 (支持客户端线程的中止)

标签: c++ winapi boost-thread


【解决方案1】:

我有一个针对 Win32 的部分解决方案的想法,但我尚未对其进行测试:

我的“线程中断”方法可以同时调用boost::thread.interrupt()、和QueueUserAPCQueueUserAPC 调用的函数只会调用boost::interruption_point() 以允许升压中断进行控制。

这应该意味着线程在等待提升同步对象或“可警报”本机窗口时都会被中断(但“不同”)。

【讨论】: