队列中的竞争条件

Jon*_*Jon 1 .net c# multithreading race-condition c#-4.0

下面的代码处理带有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);
    }
  }

}
Run Code Online (Sandbox Code Playgroud)

Yah*_*hia 5

UPDATE

队列在代码中没有以线程安全的方式使用...您显示的代码不足以确定是否存在竞争条件但是ConcurrentQueue您获得了更好的性能...并且在ThreadProcedure中您可以拥有使用null调用ProcessData,据我所知,在安全方面,ProcessData应该可以重入所有这些...

使用ConcurrentQueue- 避免一些可能的问题......并检查BlockingCollection哪些是专为线程安全的生产者/消费者场景而设计的...两者都主要是无锁的,并且非常快......