是否需要Queue.SyncRoot才能跨线程进行简单的Enqueue / Dequeue?

时间:2012-05-22 09:40:32

标签: c# .net-3.5 thread-safety queue

我有一个WorkerThread来处理队列中的元素,并且创建内容的几个MiningThread需要由WorkerThread完成。

总结:一个线程Dequeues和几个Enqueue。

我是否需要使用msdn中提出的同步模式,或者我在此特定情况下是线程安全的?

msdn一个简单的同步访问模式

Queue myCollection = new Queue();
lock(myCollection.SyncRoot)
{
    foreach (object item in myCollection)
    {
        // Insert your code here.
    }
}

2 个答案:

答案 0 :(得分:6)

是的,您需要同步。

有一个.NET4队列,您不需要同步,称为“ConcurrentQueue”: http://msdn.microsoft.com/en-us/library/dd267265.aspx

但你必须迁移到.NET4,直到那时,你仍然坚持自己进行同步

<强>更新 对于您的特定模式,.NET4中甚至还有一个更专业的类,BlockingCollection包含Producer / Consumer模式: http://msdn.microsoft.com/en-us/library/dd267312.aspx

仍然是.NET4强悍...:)

答案 1 :(得分:1)

Queue并不是线程安全的,所以你不能在多线程应用程序中使用它。您可以使用SyncRoot属性或Synchronized方法来实现同步。