4

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

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

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

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

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

4

1 回答 1

1

我对 Win32 的部分解决方案有一个想法,但我还没有测试它:

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

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

于 2010-06-17T08:54:54.037 回答