2009-07-07 13 views
2

チャットサーバーには2種類のパケットがあるとします。これらの2つのパケットは、別のユーザのステータスを取得するために使用されます。一つの要求と応答の形式と別の(NOT-STAT)である(REQ-STATRES-STATとしてこれを呼び出す)が通知形式パケットです。例えばネットワークプログラミングの一般的なタイミング問題

、私は、サーバーに[REQ-STATシンプソン]を送って、私は[RES-STATシンプソンオンライン]を得ることができます。 SIMPSONユーザーのステータスが変更された場合は、[NOT-STAT simpson offline]のようなユーザーのステータスを取得します。

さて、サーバーはマルチコアマシン上で実行されており、もちろん複数のスレッドを使用しています。サーバが[REQ-STATシンプソン]パケットを取得する場合、サーバはパケットを準備します

[オンラインRES-STATシンプソン] - SIMPSONが​​オンラインである場合。この時点で、SIMPSONはログアウトしたので、サーバはパケット[NOT-STAT simpson offline]をクライアントに送信します。サーバがを送った後に[NOT-STATシンプソンオフライン]パケット、[オンラインRES-STATシンプソン]パケットは、LOCKは、全体のプロセスのために使用されていない場合

// the server lock during using user data structure but not for the whole process. 

------[REQ-STAT simpson]------> simpson is online and prepare response packet 

<--[NOT-STAT simpson offline]-- simpson has been logged out and send not packet 

<--[RES-STAT simpson online]--- send response 

// the latest packet does not have the latest information !!! 

は、シナリオの上に起こることができます送信されますか?もしそうなら、私はそれをすべてロックする必要がありますか?その他のソリューション?

ありがとうございました。

答えて

1

受信側のプログラムが異なるパケットを処理する方法で解決できるようです。

SIMPSONが​​オンラインであるかどうかを尋ねるプログラムは、「はい」または「いいえ」と答えます。しかし、SIMPSONが​​オンラインであったかどうかは、です。私は私の要求を送ったけれど、このパケットが作成されてから1ミリ秒後にログアウトしていたので、彼がオンラインであることが保証されません。彼は私が尋ねたときだった。この情報を価値あるものに使用してください。

しかし、プログラムが "SIMPSON signed off"パケットを受信すると、SIMPSONが​​パケットで指定された時刻にサインオフしたことがわかります。これを受け取ると、彼がサインオフしたということだけが伝えられているので、現在のステータスの保留中のリクエストが上書きされます。したがって、現在のステータス要求がある場合はそれを「中止」します。中止すると、そのスレッドを正常に停止するか、その要求の結果を無視することを意味します。

別のオプションは、クライアントがの独立したイベントの順序を把握することができますので、すべてのパケットに(スレッドセーフでなければならない)、高解像度のタイムスタンプや、スレッドセーフな、クライアント固有のシーケンシャルカウンターを埋め込むことですそれらを受け取る順序。標準的なスレッドセーフなプログラミングのやり方でこれを行うことができ、それについて知識があるように聞こえます。

関連する問題