我正在尝试通过使用boost:threads而不是我们自己的Win32线程包装器来提高C ++应用程序的可移植性,并且优雅的线程终止问题(再次)让它变得丑陋。
在纯win32上,我通过使用QueueUserAPC来中断'线程,抛出“thread_interrupt”异常,导致所有RAII对象在出路时清除as described here。任何“可警告”的OS功能都可以通过这种方式中断,因此互斥等待,睡眠,串行和套接字I / O都是可能的中断点。
然而,在win32上,QueueUserAPC不会“提升:互斥量等” - 他们称之为Sleep(n)而不是SleepEx(n,true))
Boost线程确实有一个“中断”机制(类似地涉及抛出异常),但它似乎有一个缺点,即只有boost :: thread调用是可中断的,所以第三方套接字库(例如)不能中断。
怎么办?我可以在本地修改增强源以使其可中断,但这感觉是一个糟糕的选择,我认为这不会有助于可移植性。重新设计整个应用程序以消除正常线程关闭的要求是一种类似的无法吸引的路径......
答案 0 :(得分:1)
我对Win32的部分解决方案有一个想法,但我还没有测试它:
我的“线程中断”方法可以调用boost::thread.interrupt()
和AND QueueUserAPC
,QueueUserAPC
调用的函数只调用boost::interruption_point()
以允许增强中断控制
这应该意味着线程在等待提升同步对象或“可警告”的本机窗口时被中断(但“不同”)。