Windows の最高の I/O イベント通知機能は何ですか?
最高というのは、... という意味です。
- 入力ファイル記述子の数に制限はありません
- すべてのファイル記述子(ディスクファイル、ソケットなど)で動作します。
- さまざまな通知モード(エッジトリガー、リミットトリガー)を提供します
ベストアンサー1
Windows では、非同期操作は記述子ではなくファイル操作によって実行されます。ファイル操作が非同期的に完了するのを待機する方法はいくつかあります。
たとえば、ネットワーク ソケットでデータがいつ使用可能になるかを知りたい場合は、ソケットで非同期読み取り要求を発行し、それが完了すると、データが使用可能になり、取得されます。
Win32では、非同期操作はOVERLAPPED
未処理の IO 操作に関する状態を格納する構造体。
- ファイルをIO完了ポート非同期IO要求をディスパッチします。操作が完了すると、完了メッセージがキューに配置され、ワーカースレッドはそれを待機して到着時に取得できます。ユーザー定義のメッセージをキューに配置することもできます。完了ポートで使用できるファイルまたはキューに入れられたメッセージの数に制限はありません。
- 各IO操作をイベントでディスパッチします。操作に関連付けられたイベントは、完了するとシグナル状態になります(待機状態を満たします)。
WaitForMultipleObjects
一度にすべてのイベントを待機します。これには、一度にオブジェクトのみを待機できるという欠点がありますMAXIMUM_WAIT_OBJECTS
(64)。同時に他の種類のイベント (プロセス/スレッドの終了、ミューテックス、イベント、セマフォ) を待機することもできます。 - 使うスレッドプールスレッドプールは、無制限の数のオブジェクトとファイル操作を待機して実行することができます。ユーザー定義関数それぞれ完了時に。
- 使用し
ReadFileEx
てWriteFileEx
列に並ぶ非同期プロシージャ呼び出し(APC)を呼び出しスレッドに送信し、SleepEx
(またはWaitFor{Single|Multiple}ObjectsEx
) を使用するAlertable TRUE
と、各操作が完了したときに通知メッセージを受信できます。このメソッドは IO 完了ポートに似ていますが、1 つのスレッドに対してのみ機能します。
Windows NT カーネルは、内部的にはソケット、ディスク ファイル、パイプなどのファイル操作を区別しません。これらのオプションはすべて、すべてのファイル タイプで機能します。