2011-07-07 46 views
2

我使用自定義同步原語的Windows鍵的事件,通過http://locklessinc.com/articles/keyed_events/

啓發,支持線程中斷,我已經改變地方都阻塞調用像睡眠或WaitForSingleObject的使用他們的警惕性版本一樣SleepEx和WaitForSingleObjectEx。然後我可以通過QueueUserAPC排隊一個APC來中斷等待,並且如果返回值是WAIT_IO_COMPLETION,我會拋出一個特殊的異常,它會導致所有析構函數被調用,然後線程退出。這與pthread_cancel()的Linux版本類似,這會導致堆棧放開,因此線程退出時會清理內容。

我看到NtWaitForKeyedEvent()也有一個Alertable參數,所以我想知道是否可以對這種情況做同樣的事情,或者有警告?如果APC會喚醒它,我也不知道要查找什麼返回值,因爲NTSTATUS不直接對應於WIN32返回碼。有一個STATUS_USER_APC和一個STATUS_ALERTED,我不知道它是否會是這兩者之一。如果用戶APC功能不足以提醒鍵控事件等待,那是什麼?NtWaitForKeyedEvent可提醒嗎?

回答

1

NtWaitForKeyedEvent Altertable = TRUE確實看起來像它會做你想做的。這是您用NtWaitForSingleObject設置的參數以啓用APC的收集。

如果由於正在運行APC而等待完成,您將接收到STATUS_USER_APC;如果NtAlertThread與您的線程有關,則將調用STATUS_ALERTED。如果你想要的只是一個信號來阻止等待,那麼NtAlertThread就足夠了。

如果你的異常處理機制沒有SEH展開,你可能直接從APC例程拋出特殊的異常。

+0

這似乎工作得很好。我使用APC,因爲它允許我執行一些標誌的設置,以便檢查取消是否是用戶請求的。我不太確定的一件事是在等待中斷但警報不同的情況下該怎麼做。我認爲正確的做法是恢復等待(如果正在使用超時,則適當調整超時),但如果有機會錯過NtReleaseKeyedEvent(),這可能是一個問題。鍵控事件API是否以某種方式處理警報的這一方面? –