0

クライアントに接続する多くのソケットを読み書きするためにデプロイされたスレッドがあるサーバー アプリケーションを作成しています。私のマネージャーは、スレッドが不明な理由で中止された場合、すべての読み取り/書き込み作業が永久に停止するため、良い設計ではないと言います。

したがって、スレッドの Run() 関数から戻る場合を除いて、どのような状況でスレッドが中止されるのだろうか。スレッドが異常停止した場合を考慮する必要がありますか?

4

2 に答える 2

0

クライアントに接続する多くのソケットを読み書きするためにデプロイされたスレッドがあるサーバー アプリケーションを作成しています。

良いデザインではありません。クライアントごとに少なくとも 1 つのスレッドが必要です。場合によっては 2 つのスレッド(1つは読み取り用、もう 1 つは書き込み用) が必要です。I/O のブロックを扱っている場合、1 つのクライアントにサービスを提供すると、他のすべてのクライアントがブロックされる可能性があります。(非ブロッキング I/O を扱っている場合は、スレッドはまったく必要ありません。)

私のマネージャーは、スレッドが不明な理由で中止された場合、すべての読み取り/書き込み作業が永久に停止するため、良い設計ではないと言います。

彼が前進している以上の理由で、彼は正しい。

于 2013-04-16T10:09:01.983 に答える
0

場合によります。クライアントごとに 1 つのスレッドは、特にスレッドがクライアントごとにそれほど多くの作業を行わない場合、スケーラビリティに関して悪いことになる可能性があります。そのような状況では、多数のクライアントを処理するスレッドを用意する方がよい場合があります。スレッドの数と適切な量の作業を実行させることとのバランスをうまくとるという考えです。

一方、各スレッドがクライアントごとに多くの作業を行っている場合、1 つのスレッドはそれほど悪い考えではなく、スレッドのオーバーヘッドは作業負荷と比較して重要ではありません。

それはさておき、スレッドが戻るか自己終了するようにコードが書かれている場合、スレッドは中止されます。プログラム内の別のスレッドがスレッドのハンドル/ID を知っている場合、使用しているライブラリには、thread_kill() のような名前の関数がある可能性があります。これにより、他のスレッドがこのスレッドを強制終了できるようになりますが、これはほとんど常に悪い考えです。

したがって、私が懸念している限り、意図的にそれを実現するコードを記述した場合にのみ、スレッドは中止されて消えます。

例外の処理は、例外が発生したスレッド内で全体を行うのがおそらく最善です。私はそれ以外のことをしようとしたことはありません (まだ純粋な C で書いています) が、スレッドの外でそれらを処理するのは難しいということです。各スレッドが 1 つまたは複数のクライアントを処理するかどうかに関係なく、スレッド内のすべてのエラーとイベントを処理する必要があります。

1 つのスレッドが 1 つのクライアントを処理するように I を記述すれば、それを正しく取得するのが簡単になる場合があります。これを間違えると、スレッドが停止状態 (リッスンしているクライアントも待機するなど) になり、時間の経過とともにそれらが蓄積され、最終的にシステム全体が停止する可能性があります。

于 2013-04-16T11:34:21.017 に答える