我需要在具有多个消费者的多线程情况下实现一个队列,但只有一个线程会修改队列(入队)。使用队列是否安全,或者我应该考虑使用 ConcurrentQueue?
问问题
935 次
2 回答
2
Enqueue
和都是Dequeue
修改队列的操作。所以,如果有一个线程调用Enqueue
,另一个线程调用Dequeue
,那么这两个调用需要同步。
如果您使用的是Queue<T> 类,则队列不是线程安全的,您需要通过将调用包装在
lock
statements中来同步调用。如果您使用ConcurrentQueue<T> 类,则队列是线程安全的,并且会为您进行同步。
于 2013-09-22T05:19:29.810 回答
2
如果您使用的是框架 4 或更高版本,那么更好的选择是使用专门为生产者/消费者模式设计的BlockingCollection (默认情况下它在内部是一个 ConcurrentQueue)。它使您可以轻松地协调线程之间的生产和消费,而无需过多考虑锁/监视器。只需使用GetConsumingEnumerable()即可使用项目,无需任何其他手动同步工作。MSDN 示例
于 2013-09-22T05:25:02.287 回答