2011-04-26 14 views
3

我具有由各个线程访问的Queue<T>字段。 Enequeue()从多个线程称为每秒多次,同时有一个线程执行Dequeue()Count操作。System.Collections.Queue <T>,线程,锁定和同步

我还一直在想很多关于这个到现在为止,因为我打它的“安全”和之前与该队列的任何操作静态物体上使用lock。虽然目前没有任何性能问题,但如果它们是多余的,我想摆脱这些锁。我的问题是:

  1. 因为我永远不会遍历队列,在这种情况下真的需要锁吗?我的意思是,当程序碰巧一个线程出现并且第二个线程同时在处出错元素时程序会崩溃吗?
  2. 应该我也许用Queue.Synchronized()得到的包装,如果是这样:会影响性能比原来的队列?

回答

3

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

2:ConcurrentQueue<T>将很好地工作;我个人使用的是我在SO上编写的版本,Creating a blocking Queue<T> in .NET? - 它可以轻松节流队列的大小,并且无需循环即可高效地出队

注意;与你当前的实现锁对象应该只是静态,如果队列是静态的(这是不明确的问题,虽然) - 否则所有类似的队列可能共享锁

+0

感谢,'ConcurrentQueue '出现为我工作的所有工作,没有沉重的锁。 – avance70 2011-04-26 12:53:54

+0

@ avance70 - 除非你已经进行了配置,否则我不会自动假设这里的锁是“沉重的”...... – 2011-04-26 13:09:57

+0

我认为我的锁很好地实现,只影响到几个必要的行。但是,正如你所建议的'ConcurrentQueue '我在某处读到它使用'System.Threading.Interlocked'操作,它比'lock' – avance70 2011-04-26 13:21:49