非同期 I/O (または Win32 用語で「オーバーラップ」I/O) が使用される場合、OVERLAPPED
構造体とそのhEvent
メンバーを処理する必要があります。I/O 関数が読み取りまたは書き込み操作を遅らせる場合は、ERROR_IO_PENDING
エラー コードが返され、非同期操作が関数で完了するのを待ってから、WaitForXxxEvent
を呼び出しますGetOverlappedResult
。
ただし、I/O 操作がすぐに完了すると、 は取得されずERROR_IO_PENDING
、読み取り操作では読み取りバッファーがすぐにいっぱいになります。しかし、OVERLAPPED::hEvent
メンバーはどうですか?シグナル状態に設定されますか? それについての明確な声明は見つかりませんでした。
この質問は無意味に思えるかもしれません (操作が既に完了していることがわかっているのに、なぜイベントに対処する必要があるのでしょうか)。
edgar.holleisのコメントで指摘されているように、Raymond Chenはブログで次のように説明しています。
非同期 I/O が同期的に完了する場合、OVERLAPPED 構造体の hEvent はとにかく通知されますか?
はい。
I/O が (同期的または非同期的に) 完了すると、イベントが通知され、完了ステータス通知がキューに入れられます。この
GetOverlappedResult/Ex
関数は、すでに完了した I/O を待機するために使用できます。すぐに戻るだけです。I/O が完了したかどうかを HasOverlappedIoCompleted に問い合わせると、I/O が同期的に完了した場合、「もちろん、完了しました。かなり前に完了しました!」と正しく報告されます。つまり、非同期 I/O 要求が同期的に完了する場合は、あたかも非同期で完了したかのように論理的に扱うことができます。まばたきする前に、非同期に完了します。