以下のコードは、2つのパラメータを指定して送信されるソケットメッセージを処理します。情報をキューに入れ、別のスレッドで処理されます。私の質問は、2つのメッセージが直後に来て、デキューされてProcessDataメソッドに送られた場合です。ProcessDataに競合状態がありますか?キューのレース条件
private void DataIn(long Code, string Message)
{
if (!Started)
{
if (DataInQueue == null)
DataInQueue = new Queue();
DataInThread = new Thread(new ThreadStart(ThreadProcedure));
DataInThreadEnding = false;
DataInThread.IsBackground = true;
DataInThread.Start();
Started = true;
}
DataInQueue.Enqueue(new cDataIn(Code, Message));
}
private void ThreadProcedure()
{
while (!ProgramEnding)
{
Queue mySyncdQ = Queue.Synchronized(DataInQueue);
if (mySyncdQ != null && mySyncdQ.Count > 0)
{
cDataIn data = null;
// Creates a synchronized wrapper around the Queue.
if (mySyncdQ.Count > 0)
data = (cDataIn)mySyncdQ.Dequeue();
ProcessData(data);
}
}
}
問題があると言っていますか? – Jon
Queueクラスのドキュメント(http://msdn.microsoft.com/en-us/library/system.collections.queue(v=VS.100).aspx)には、スレッドの安全性に関する段落があります。インスタンスメンバーはTSではありません。私は実装を見て、coudが何かを見ていないが、あなたは2つのスレッドをスピンアップすることで自分自身を確認することができます。 1つは順次メッセージ(1,2,3、..)でポンプし、もう一方はそれらを読み込みます。あなたはたぶん例外やギャップ/ダブルス(1,2,2,4,5、...)を得るでしょう。 – gjvdkamp
上記の私の更新を参照してください... – Yahia