5

IO 完了ポートが完了すると実際に何が起こるかについて、少し混乱しています。

Win API は、特定のハンドル (ソケットとしましょう) を持つコールバック参照を何らかの方法でキューに入れる (またはスタックする) ことができる IOCP キューへのアクセスを許可していると思います。Windows が NIC から割り込みを受信すると、ある時点で NIC の IOCP キューに到達し、独自の(IOCP) スレッド プールでコールバックを実行します。

私の質問は、割り込みが受信されたときに生成されたスレッドプールからのこのスレッドですか、それとも実際にはWin APIへの呼び出しが行われたときに生成され、IOCPによって起こされるまでスレッドを効果的に待機状態にします列?

編集:私は
これを見つけました: http://msmvps.com/blogs/luisabreu/archive/2009/06/04/multithreading-io-and-the-thread-pool.aspxは、その I/O 完了ポートでパケットをキューに入れます。ポートは次に進み、スレッド プールのスレッドの 1 つを使用して、指定したコールバックを実行します。」

4

1 に答える 1

6

おそらく、I/O 完了ポートを、オーバーラップした操作の完了時にオペレーティング システムがその結果を格納するスレッド セーフ キューと考える方が簡単でしょう。

IOCP を作成し、次にいくつかのスレッドを作成します。これらのスレッドは関数を呼び出して、このキューから項目を削除します。通常、これはGetQueuedCompletionStatus()です。この関数は基本的に、IOCP (キュー) に何かがあるまでスレッドをブロックし、スレッドがその何かを取得して実行できるようにします。

ファイル ハンドルとソケットを IOCP に関連付けます。これは単に、関連付けられた重複した完了が IOCP (キュー) に配置されることを意味します。

それよりも複雑ですが、それがあなたが考えるべき方法です。

于 2012-11-01T21:27:30.300 に答える