1

私はずっとグーグルで検索しましたが、これに対する答えは見つかりませんでした。私は自分で簡単にできるように自分の小さなTcpライブラリをプログラミングしています。サーバーには、ソケットとネットワークストリームを持つ「ConnectedClient」オブジェクトがあります。サーバーの静的クラスには、長さのプレフィックスが付いたストリームを送信するSend関数があります。ストリームをスレッドセーフにしたいのですが、クライアントごとに。これはそのために機能しますか?

Send(ConnectedClient client, ...(rest of parameters nor relevant))
{
lock (client.lockObject)
{
// Writing to stream thread-safely I hope...
}
}

私は自分自身を十分に明確にしたことを願っていますが、そうでない場合は、詳細を尋ねてください。

4

1 に答える 1

1

ある種のマルチプレクサを書いているようです。実際、ペイロード全体 (および長さプレフィックス) を単一の 内に記述し、が相互排他リソースを表しlockている限りlockObject(つまりlockObject、私たちが使用しないすべてのクライアントに共通である必要があります)、これは正常に機能するはずです。衝突したくない)。

おそらく、よりトリッキーな質問は、そのメソッド内で応答を読み取るか (success/return-value/critical-fail)、それとも応答を非同期で読み取り、最初の書き込み中に次のライターにストリームへの書き込みを許可するかということです。メッセージが飛んでいます…

比較のために、BookSleeve (redis マルチプレクサー、参照コードが必要な場合は完全なソースが利用可能) を作成するときは、別の戦略を選択しました: 1 つの専用スレッドがスレッドへのすべての書き込みを行い、すべての呼び出し元がスレッドに追加するだけです-セーフ キュー; そうすれば、未処理の作業があっても、発信者が遅れることはありません。

于 2011-07-04T18:08:32.407 に答える