可警示 I/O
可警示 I/O 是應用程式執行緒只有在處於可警示狀態時,才會處理非同步 I/O 要求的方法。
若要瞭解執行緒何時處於可警示狀態,請考慮下列案例:
- 執行緒會使用回呼函式的指標呼叫 ReadFileEx ,以起始非同步讀取要求。
- 執行緒會使用回呼函式的指標呼叫 WriteFileEx ,以起始非同步寫入要求。
- 執行緒會呼叫從遠端資料庫伺服器擷取資料列的函式。
在此案例中, 對 ReadFileEx 和 WriteFileEx 的呼叫很可能會在步驟 3 中的函式呼叫之前傳回。 當他們這麼做時,核心會將指標放線上程的非同步程序呼叫 (APC) 佇列上。 核心會特別維護此佇列,以保存傳回的 I/O 要求資料,直到對應的執行緒可以處理為止。
當資料列擷取完成且執行緒從 函式傳回時,其最高優先順序是呼叫回呼函式來處理佇列上傳回的 I/O 要求。 若要這樣做,它必須進入可警示的狀態。 執行緒只能藉由呼叫具有適當旗標的下列其中一個函式來執行此動作:
- SleepEx
- WaitForSingleObjectEx
- WaitForMultipleObjectsEx
- SignalObjectAndWait
- MsgWaitForMultipleObjectsEx
當執行緒進入可警示狀態時,會發生下列事件:
- 核心會檢查執行緒的 APC 佇列。 如果佇列包含回呼函式指標,核心會從佇列中移除指標,並將其傳送至執行緒。
- 執行緒會執行回呼函式。
- 佇列中剩餘的每個指標都會重複步驟 1 和 2。
- 當佇列是空的時,執行緒會從置於可警示狀態的函式傳回。
在此案例中,一旦執行緒進入可警示狀態,它會呼叫傳送至 ReadFileEx 和 WriteFileEx的回呼函式,然後從置於可警示狀態的函式傳回。
如果執行緒在其 APC 佇列是空的時進入可警示狀態,則執行緒的執行將會由核心暫停,直到發生下列其中一項為止:
- 等候的核心物件會發出訊號。
- 回呼函式指標會放在 APC 佇列中。
使用可警示 I/O 的執行緒會更有效率地處理非同步 I/O 要求,比只等待 重迭 結構中的事件旗標設定,而且可警示的 I/O 機制比 I/O 完成埠 更複雜。 不過,可警示的 I/O 只會將 I/O 要求的結果傳回給起始它的執行緒。 I/O 完成埠沒有這項限制。
相關主題