2014-02-06 138 views
1

我使用QueueUserAPC()函數將我的異步過程調用添加到我的線程的APC隊列中。有沒有辦法丟棄APC隊列?

比方說,我已經對線程排隊了10次調用,並且在線程進入SleepEx()後執行其中一個調用,出於某種原因,我決定不執行下一個APC。我對這個問題的原始和簡單的解決方案是用一個if塊來檢查一個全局變量來包裝所有的調用,並且只有當這個條件變量被設置(或沒有)時才執行該塊。

有沒有更好的方法來做到這一點?我可以放棄一個線程的APC隊列,以便其中的其他呼叫不會被調用嗎?

回答

3

沒有用戶模式的方式從APC隊列中刪除項目。 (你可以從內核模式,但即使在那裏,從APC隊列中刪除項目也只能在拆卸的情況下完成。)在任何情況下,QueueUserAPC都不會返回一個可以取消的可用句柄,並且整個隊列的清空是壞主意,因爲其他代碼可能會將項目放在您不知道的隊列中。

+0

我相信運行異步調用的線程必須有機會決定如何處理自己的隊列。其他代碼將項目推送到隊列可能不知道該線程的內部狀態。調用異步函數或放棄它們應該是線程的責任。但是,我認爲可以實現自己的隊列;只是將代碼的隊列代碼指向一個函數的指針,另一個指向參數,另一個處理等待函數。謝謝回覆。 – Oregano

+0

@Oregano - QueueUserAPC(用雷蒙德陳的話來說)是用「核心色眼鏡」設計的。整個APC機制是圍繞允許內核在線程被阻塞時調用用戶模式回調而建立的。 –

相關問題