1

我需要一个可以由 2 个线程同时访问的队列,一个线程可以将一个项目入队,而另一个线程可以将另一个项目出队。班级是否Queue<T>符合这个要求?或者我应该从头开始实现它(例如使用像这样的单个生产者/消费者循环队列实现)?

4

3 回答 3

4

如果您正在使用.NET 4.0,您可以使用ConcurrentQueue。这是推荐的方法。

关于Queue<T>其本身,MSDN 页面说明如下(向下滚动到该Thread Safety部分:

只要集合不被修改,一个队列可以同时支持多个读取器。即便如此,通过集合枚举本质上不是线程安全的过程。为了保证枚举过程中的线程安全,可以在整个枚举过程中锁定集合。要允许集合被多个线程访问以进行读写,您必须实现自己的同步。

除了这些解决方案,您还可以实现自己的线程安全队列。实现线程安全的一种方法是不变性(尽管这将涉及一些锁定)。您可以在 Eric Lippert 的博客中阅读有关编写不可变队列的信息,请点击此处。或者,您可以使用基于 F# 的数据类型,其中大多数是不可变的。

于 2012-06-25T09:45:37.990 回答
2

如果您正在从您提到的生产者/消费者那里实现消费者,那么BlockingCollection是您的朋友。否则,正如其他人所说,ConcurrentQueue。BlockingCollection 允许您在没有要删除的元素时调用 .Take() 并将其阻塞,从而允许使用 .Take() 来简化消费者循环while (true)

于 2012-06-25T09:44:16.800 回答
1

ConcurrentQueue如果您运行的是 .NET 4,最简单的方法是直接使用Microsoft 提供的。:)

于 2012-06-25T09:43:05.810 回答