web-dev-qa-db-ja.com

ソケットでデータを送信するスレッドとデータを受信するスレッドを指定するのが悪い設計なのはなぜですか?

I SOに質問を投稿 2つのスレッドが同じソケットでsend()recv()を同時に実行できるかどうか。可能ではありますが、これを実装することは非常に貧弱な設計の例であると言われました。

私の理論的根拠は、パケットは20msごとに送信する必要があるため、何かを送信する前に何かを受信するまで待つことができないということです。送信を実行するスレッドを指定すると、この20ミリ秒の間隔を、関連のない処理オーバーヘッドの影響を受けないようにすることが最も簡単になると思いました。

なぜそれがそんなに悪い考えで、より良いデザインは何ですか?

4
gaazkam

これは必ずしも悪い設計ではありませんが、接続数の多いアプリケーションでは、スレッドの消費量が増加します(スレッドを作成できなくなる可能性があります)。

少数のスレッドで多数のソケットをサポートするには、 select(2) システムコールを使用して非同期IOに切り替えます。

少数の接続しか想定しておらず、送信者が受信者によってブロックされないようにしたい場合は、2つのスレッドで問題ありません。

[〜#〜]しかし[〜#〜]保証がないことに注意してくださいLinuxスケジューラが20ミリ秒ごとに送信者を実行すること。 (システム内のすべてのプロセスにわたって)実行されている他のスレッドの数と、スレッドに割り当てる優先順位に応じて、これは近づく可能性があります。ただし、リアルタイムのオペレーティングシステムを使用しない限り、送信者は任意の時間遅延する可能性があります。

8
guest