我需要一个可以通过2个线程同时访问的队列,一个可以将一个项排入队列,而另一个项排队另一个项。 Queue<T>
班级是否符合此要求?或者我应该从头开始实现它(例如使用单个生产者/消费者循环队列实现,如this)?
答案 0 :(得分:4)
如果您使用的是.NET 4.0
,则可以使用ConcurrentQueue。这是推荐的方法。
关于Queue<T>
本身,MSDN页面会显示以下内容(向下滚动到Thread Safety
部分:
只要未修改集合,队列就可以同时支持多个阅读器。即便如此,通过集合枚举本质上不是一个线程安全的过程。为了在枚举期间保证线程安全,您可以在整个枚举期间锁定集合。要允许多个线程访问集合以进行读写,您必须实现自己的同步。
除了这些解决方案,您还可以实现自己的线程安全队列。实现线程安全的一种方法是不变性(尽管这将涉及一些锁定)。您可以在Eric Lippert的博客here中阅读有关编写不可变队列的信息。或者,您可以使用F#-based data types,其中大多数是不可变的。
答案 1 :(得分:2)
如果您正在实施您提到的生产者/消费者的消费者,那么BlockingCollection就是您的朋友。否则,正如其他人所说,ConcurrentQueue。 BlockingCollection允许您在没有要删除的元素时调用.Take(),并使其阻塞,允许仅使用while (true)
简化消费者循环。
答案 2 :(得分:1)
最简单的方法是直接使用Microsoft的ConcurrentQueue
,如果你运行的是.NET 4。 :)