System.Collections.Queue <t>,线程,锁定和同步</t>

时间:2011-04-26 11:10:07

标签: c# multithreading synchronization locking queue

我有一个Queue<T>字段,可以被各种线程访问。 Enequeue()每秒多次从多个线程调用,而有一个单个线程执行Dequeue()Count操作。

到目前为止,我一直没有考虑过这个问题,因为我在使用此队列进行任何操作之前,将它“安全”并在静态对象上使用了lock。虽然目前没有任何性能问题,但如果它们是多余的,我想摆脱它们。我的问题是:

  1. 因为我从不迭代队列,在这种情况下真的需要锁吗?我的意思是,当一个线程排队并且第二个线程在完全的同时将元素排队时,程序是否会崩溃?
  2. 我应该使用Queue.Synchronized()来获取包装器,如果是这样的话:与原始队列相比,这会影响性能吗?

1 个答案:

答案 0 :(得分:3)

1:是的,他们是必要的;将变异状态排队和出列;标准队列不是线程安全的

2:ConcurrentQueue<T>可以很好地运作;我个人使用我在这里写的一个版本,Creating a blocking Queue<T> in .NET? - 它可以很容易地限制队列的大小,并且无需循环就可以有效地出列

请注意;对于你当前的实现,如果队列是静态的,那么lock-object应该只是静态的(虽然在问题中不清楚) - 否则所有类似的队列可能都在共享一个锁