Alertable I/O
Alertable 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 を使用するスレッドは、OVERLAPPED 構造体のイベント フラグが設定されるのを待つだけの場合よりも効率的に非同期 I/O 要求を処理します。また、警告可能な I/O メカニズムは、I/O 完了ポート 使用するよりも複雑ではありません。 ただし、警告可能な I/O は、I/O 要求の結果を開始したスレッドにのみ返します。 I/O 完了ポートには、この制限はありません。
関連トピック
-
非同期プロシージャ呼び出し を する