1

Microsoft Windows WinSock API を使用している小さな http サーバーを作成しています。

複数のユーザーを処理する場合、マルチスレッド ロジックを適用する必要がありますか?

現在、Windows は、ネットワーク イベントが発生し、各メッセージが send() または recv() で使用されるソケットを (wParam で) 運ぶときにメッセージを送信します。

クライアント A が接続していくつかのファイルを要求すると、通常、Winsock によって多数のソケットが作成されます。私のサーバーは、「このファイルをソケット123に送信し、後でそのファイルをソケット456に送信する」というメッセージを受け取ります

別のクライアントが接続すると、それもいくつかのソケット、たとえば 789 と 654 を取得します。

私のサーバーは、提供されたソケット番号を使用してデータを送信する要求に応答します。正しいファイルを正しいソケットに送信する必要があるため、誰がファイルを必要としているかを知る必要はありません。

接続の受け入れとメッセージのプログラムへの送信を処理するときに、Windows 自体が複数のスレッドを使用するかどうかはわかりません。

だから私の質問は:

複数のユーザーを処理する場合、マルチスレッド ロジックを適用する必要がありますか? もしそうなら、どの時点でスレッドを作成する必要がありますか?

4

2 に答える 2

2

通常、ソケットごとにスレッドを使用します。また、接続を受け入れている場合は、ループ内のスレッドがブロックされ、着信接続ソケットを待機しています。次に、新しいスレッドを作成し、このソケット ハンドルを新しいスレッドに渡して処理します。その接続が閉じられて終了したら、そのスレッドを終了 (または参加) させます。これがスレッド化されたサーバーの基礎です。

疑似コードで...

loop {
  socket = accept();
  new ThreadHandler( socket )
}

単一のスレッドを使用して複数のソケットを処理するのは注意が必要です。これは主に、スレッドが書き込み中、またはソケットからの読み取り中にブロック (停止、待機) する可能性があるためです。気弱な人向けではありません。

于 2012-10-22T08:15:47.383 に答える
0

ほとんどのアプリケーションでは、ネットワーク接続を処理するために複数のスレッドを使用しても意味がありません。私はこの質問への回答に小さな記事を書きました。

複数のスレッドは、たとえばデータベースサーバーで、受信したデータを処理するために予測できない量のCPU時間を必要とする場合、またはプログラム構造で要求を非同期に処理できない場合に役立ちます。

3番目のオプションである「ワーカープール」もあります。単一のスレッドがすべての着信接続を処理し、着信要求を逆シリアル化してから、一度に1つのアイテムを処理するスレッドのプールに作業項目を渡します。

このように、接続を開くだけではまだスレッド全体に必要なリソースを消費せず、システムの負荷はプール内のスレッドの数によって暗黙的に制限されます。

于 2012-10-22T08:35:10.720 に答える