1

一度に1つのTCPソケットでデータを送信し、データを受信する20個のスレッドがあります。アプリケーションを実行しても同期の問題は見られませんが、私の理解によると、2 つのスレッドが同時に tcp ソケットに書き込もうとした場合、または 1 つのスレッドが書き込み中に他のスレッドが読み取りを行っている場合に問題が発生する可能性があります。

私の理解が正しければ、エラーに直面しないのはなぜですか?

4

2 に答える 2

6

まず、各ソケットの送信ストリームと受信ストリームは独立しています。あるスレッドが送信中に別のスレッドが受信していても問題はありません。

複数のスレッドが 1 つのソケットに書き込もうとした場合の動作は、通常、未定義です。実際には、スレッドの 1 つからの書き込み呼び出しは、最初に TCP スタック ステート マシンのロックに入り、他のスレッドが入ったり、そのデータを書き込んだり、ロックを解放したり、スタックを終了したりできないようにするため、他のスレッドからの書き込み呼び出しを許可します。続行するスレッド。これにより、単一の書き込み呼び出しをシリアル化できます。プロトコルの実装が 1 回の書き込み呼び出しですべての PDU を送信できる場合は、問題ありません。PDU が複数の書き込み呼び出しを必要とする場合、複数のスレッドからの書き込み呼び出しがインターリーブされるため、発信 PDU がスライスされる可能性があります。

複数のスレッドから1つのソケットへの受信呼び出しを行うことは、ただ... 何かです。スタックの内部同期により、ソケットごとに一度に 1 つの受信呼び出ししか許可されない場合でも、TCP のストリーミングの性質により、受信したデータは疑似任意の方法でスレッド間で確実に分割されます。それをしないでください、それはクレイジーです。

TCP には、データ ストリームを多重化するメカニズム、つまり複数のソケットがすでにあります。それらを正しく使用する必要があります。

1 つのソケットでデータ ストリームを多重化する必要がある場合は、TCP の上にデータ ルーティング プロトコルを追加し、このプロトコルを 1 つの受信スレッドだけに実装する必要があります。このスレッドは仮想接続のリストを保持できるため、他のスレッドからのサービス ストリーム/メッセージ リクエストを処理できます。

于 2013-07-12T08:12:31.070 に答える