轉自http://blog.csdn.net/hurtmanzc/article/details/1687000
這是MSDN官網詳細的介紹:http://msdn.microsoft.com/en-us/library/windows/desktop/ms681951(v=vs.85).aspx
APC : asynchronous procdure call 異步過程調用
Alertable IO(告警IO)提供了更有效的異步通知形式。ReadFileEx / WriteFileEx在發出IO請求的同時,
提供一個回調函數(APC過程),當IO請求完成後,一旦線程進入可告警狀態,回調函數將會執行。
以下五個函數能夠使線程進入告警狀態:
SleepEx
WaitForSingleObjectEx
WaitForMultipleObjectsEx
SignalObjectAndWait
MsgWaitForMultipleObjectsEx
線程進入告警狀態時,內核將會檢查線程的APC隊列,如果隊列中有APC,將會按FIFO方式依次執行。
如果隊列爲空,線程將會掛起等待事件對象。以後的某個時刻,一旦APC進入隊列,線程將會被喚醒
執行APC,同時等待函數返回WAIT_IO_COMPLETION。
QueueUserAPC可以用來人爲投遞APC,只要目標線程處於告警狀態時,APC就能夠得到執行。
使用告警IO的主要缺點是發出IO請求的線程也必須是處理結果的線程,如果一個線程退出時還有
未完成的IO請求,那麼應用程序將永遠丟失IO完成通知。
PS:Each thread has its own APC queue. The queuing of an APC is a request for the thread to call the APC function. The operating system issues a software interrupt to direct the thread to call the APC function.