2010-06-16 65 views
4

我試圖通過使用boost:線程代替我們自己的Win32線程的包裝來提高C++應用程序的可移植性,並且優雅的線程終止問題(再次)增加了它醜陋的頭部。boost :: threads - 如何正常關機?

在純win32上,我通過使用QueueUserAPC來拋出一個「thread_interrupt」異常,導致所有RAII對象在出路as described here上清除。任何'可警告的'操​​作系統功能都可以用這種方式來中斷,所以諸如互斥鎖等待,睡眠,串行和套接字I/O都是可能的中斷點。

然而,升壓:互斥等不「警惕性」的函數QueueUserAPC win32上 - 他們稱之爲之類的睡眠(N),而不是SleepEx(N,真))

升壓線程確實有「中斷「機制(類​​似地涉及拋出異常),但它似乎有缺點,即只有boost :: thread調用是可中斷的,所以不能中斷第三方套接字庫(例如)。

怎麼辦?我可以在本地修改boost源以使其可以中斷,但是這感覺像是一個糟糕的選擇,我不認爲有助於可移植性。重新設計整個應用程序以刪除優美線程關閉要求是類似的不吸引人的路線......

+0

只是想知道,你是什麼意思,優雅的關機?因爲如果你問我,interupts更像是最後一種非常醜陋的關機方式。 – KillianDS 2010-06-17 21:29:22

+0

@KillianDS - 通過優雅的關機,我的意思是對象在出路時被正確地破壞。增強'中斷'會引發異常來實現此目的。不切實際的關機不會破壞對象,所以會泄漏資源。 – Roddy 2010-06-17 22:01:41

+0

沒有爲此提供接口的第三方庫的優美中斷是不可能的。 – Basilevs 2010-06-18 11:42:30

回答

1

我有一個爲Win32的部分解決方案的想法,但我還沒有對它進行測試:

我的「線程中斷「方法可以同時調用boost::thread.interrupt()和AND QueueUserAPC並且由QueueUserAPC調用的函數只會調用boost::interruption_point()以允許升壓中斷進行控制。

這應該表示線程在等待增強同步對象或「可警告」本機窗口時都會中斷(但「不同」)。