Windows非同期I/Oのキャンセル

The Old NewThingの「Ready... cancel... wait for it! (part 1)」を読んだ。

非同期I/O開始時にAPIに渡したOVERLAPPED構造体は、I/Oが完了するまで解放してはならない、という話。


SUCCESSやERRORが返ってきたときはもちろんI/Oは完了している。
では、CancelIo()を呼んだとき、I/Oはいつ完了するのか。
CancelIo()を呼んだ時ではない。あくまで、I/Oサブシステムからの完了イベントを待たなければならない。
具体的には、CancelIo()を呼んだらWaitForSingleObject()かGetOverlappedResult()で待てばよい。


最後に練習問題が二つあった。
一つ目は、I/Oをキャンセルしても、結果がSTATUS_CANCELEDにならないことがあることについて説明せよというもの。

これはおそらく、CancelIo()がデバイスドライバに届く前にI/OでSUCCESSまたはERRORが起こることを言っていると思われる。

二つ目は、ReadFileEx()を使う場合には上記の方法では不完全なので、それを説明して修正せよ、というもの。この答えは次回に示されるらしいので、また暇なときにでも続きを読むことにしよう。