Windows では、あまりにも多くのスレッドが作成されるのを避けるために作業項目を挿入する方法が 2 つあります。
手段 1: IOCP を使用します。
手段 2: QueueUserApc を使用します。
ただし、手段 1 は手段 2 よりもはるかに複雑です。
だから私の質問は、手段2の利点と比較して、手段1の利点は何ですか?
Windows では、あまりにも多くのスレッドが作成されるのを避けるために作業項目を挿入する方法が 2 つあります。
手段 1: IOCP を使用します。
手段 2: QueueUserApc を使用します。
ただし、手段 1 は手段 2 よりもはるかに複雑です。
だから私の質問は、手段2の利点と比較して、手段1の利点は何ですか?
を呼び出すときはQueueUserApc
、特定のスレッドをターゲットにする必要があります。
IOCP には組み込みのスレッド ディスパッチ メカニズムがQueueUserApc
あり、スレッドのプールから最も効率的なスレッドをターゲットにすることができます。スレッド ディスパッチ メカニズムは、同時に実行されるスレッドが多すぎる (余分なコンテキスト スイッチと競合が発生する) ことや、同時に実行されるスレッドが少なすぎる (パフォーマンスが低下する) ことを自動的に防ぎます。
Windows は、IOCP ジョブを実行しているスレッドの数を実際に追跡しています。最初に、実行できるスレッドの数を、マシン上の仮想コアの数と同じに設定します。ただし、I/O または同期のためにスレッドがブロックされると、IOCP ポートでブロックされている別のスレッドが自動的に解放され、スレッドの枯渇を回避します。
さらに、IOCP は I/O に簡単に接続できるため、I/O イベントが IOCP ポートでブロックされたスレッドのディスパッチをトリガーします。これは、Windows で多数の宛先への I/O を実行する最も効率的な方法です。