2012-06-25 50 views

回答

4

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

关于Queue<T>本身的MSDN页说以下(向下滚动到Thread Safety部分:

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

除了这些解决方案,您还可以实现您自己的线程安全队列。实现线程安全的一种方法是不变性(尽管这将涉及一些锁定)。您可以在Eric Lippert的博客here上阅读有关编写不可变队列的内容。或者,您可以使用F#-based data types,其中大部分是不可变的。

+0

我以为这是一个无锁的[this](http://www.codeproject.com/Articles/43510/Lock-Free-Single-Producer-Single-Consumer-Circular) – enzom83

1

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

2

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

相关问题