【发布时间】:2013-09-22 05:16:18
【问题描述】:
我需要在具有多个消费者的多线程情况下实现一个队列,但只有一个线程会修改队列(入队)。使用 Queue 是否安全,或者我应该考虑使用 ConcurrentQueue?
【问题讨论】:
标签: c# .net multithreading queue
我需要在具有多个消费者的多线程情况下实现一个队列,但只有一个线程会修改队列(入队)。使用 Queue 是否安全,或者我应该考虑使用 ConcurrentQueue?
【问题讨论】:
标签: c# .net multithreading queue
Enqueue 和 Dequeue 都是修改队列的操作。所以,如果有一个线程调用Enqueue,另一个线程调用Dequeue,那么这两个调用需要同步。
如果您使用的是Queue<T> Class,则队列不是线程安全的,您需要通过将调用包装在lock statements 中来同步调用。
如果您使用的是ConcurrentQueue<T> Class,队列是线程安全的,并且会为您进行同步。
【讨论】:
如果您使用的是框架 4 或更高版本,那么更好的选择是使用专为生产者/消费者模式设计的BlockingCollection(默认情况下它在内部是一个 ConcurrentQueue)。它使您可以轻松地协调线程之间的生产和消费,而无需过多考虑锁/监视器。只需使用GetConsumingEnumerable() 来消费项目,无需任何其他手动同步工作。 MSDN Example
【讨论】: