2

この記事のセクション「さらに待機中...」で、著者が I/O とスレッドの同期について話したとき、彼が示した最初の例は次のとおりです。

hFile = CreateFile(....,FILE_IO_OVERLAPPED,...);
ReadFile(hFile,...)
< Do some computation.>
WaitForSingleObject(hFile,INFINITE);

「CreateFile」と「ReadFile」の両方が同期API であるという印象がありましたね。ここで「WaitForSingleObject」が必要なのはなぜですか? 「CreateFile」と「ReadFile」は、操作が終了してから戻るまでブロックされませんか?

次に、著者が「アラート可能な待機」について話すと、さらに混乱が生じます。WaitForSingleObjectEx() 後のスレッド状態とは何ですか? 次に、著者が与える理由:

while (WaitForSingleObject(hObject,TRUE)==WAIT_IO_COMPLETION);

の代わりに例として

while (WaitForSingleObjectEx(hObject,TRUE)==WAIT_IO_COMPLETION);

?

「ex」関数は次のように一緒にする必要があります。

hFile = CreateFile(....,FILE_IO_OVERLAPPED,...);
ReadFileEx(hFile,...)
< Do some computation.>
while (WaitForSingleObjectEx(hObject,TRUE)==WAIT_IO_COMPLETION);

もう少し説明できる人はいますか?

ありがとう、

4

4 に答える 4

3

Well, you quoted the code, but apparently didn't read it :-) "Overlapped IO" is async.

As for alertable waits, I don't think they are used all that often.

于 2012-09-10T12:32:38.493 に答える
2

それらは非常に多くの質問です。

「CreateFile」と「ReadFile」の両方が同期 API であるという印象がありましたね。

どちらも本当です。Create/Read FileFunction に渡すパラメーターによって異なります。詳細については、こちらをご覧ください。短い抜粋:

... hFile が FILE_FLAG_OVERLAPPED で開かれている場合、それは非同期ファイル ハンドルです。それ以外の場合は同期です....

WaitForSingleObjectあなたの2番目の質問については、それは間違っていると思いますWaitForSingleObjectEx

Ex バージョンの機能を使用するかどうかは、Ex バージョンの追加機能が必要かどうかによって異なります。コードにそれらを混在させると、スタイルが悪いと思いますが。

于 2012-09-10T12:38:59.743 に答える
2

ドキュメントには、次のようにも記載されています。

非同期 I/O は、オペレーティング システムが I/O 命令をバックグラウンドで実行できるようにする方法です。大まかに言えば、ReadFile または WriteFile への呼び出しが呼び出し元にすぐに返され、I/O 操作自体が計算とオーバーラップするという考え方です。最初にそれを呼び出したスレッドの。 この手法は、ドライバーが非同期 I/O をサポートしている I/O デバイスに対してのみ機能し、CreateFile 呼び出しに渡すことができるフラグ FILE_IO_OVERLAPPED (*)を通じてプログラマーに明示します。このようなファイル オブジェクトに対して実行される I/O は、同期 I/O とはまったく異なる動作をします。

メソッドは、CreateFile に渡されるパラメーターに応じて同期/非同期になります。

* FILE_FLAG_OVERLAPPED を読み取る必要があります

于 2012-09-10T12:34:58.303 に答える
0

のドキュメントを読むReadFile():

この関数は、同期操作と非同期操作の両方に対応するように設計されています。

ReadFile()FILE_FLAG_OVERLAPPEDがに渡されCreateFile()OVERLAPPED構造体がに渡された場合、 は非同期ですReadFile()。例:

hFile = CreateFile(..., FILE_IO_OVERLAPPED, ...); 
...
OVERLAPPED ol = {0};
ol.hEvent = CreateEvent(NULL, TRUE, FALSE, NULL);
if (!ReadFile(hFile, ..., &ol))
{
    if (GetLastError() != ERROR_IO_PENDING)
    {
        // error... 
    }
}
...
WaitForSingleObject(ol.hEvent, INFINITE); // or GetOverlappedResult(hFile, &ol, ..., TRUE);
于 2012-09-10T22:57:22.183 に答える