我需要在具有多个使用者的多线程情况下实现队列,但只有一个线程会修改队列(Enqueue)。使用Queue是安全的还是我应该考虑使用ConcurrentQueue?
答案 0 :(得分:2)
Enqueue
和Dequeue
都是修改队列的操作。因此,如果有一个线程调用Enqueue
而另一个线程调用Dequeue
,那么这两个调用需要同步。
如果您使用的是Queue<T> Class,则该队列不是线程安全的,您需要通过将其包装在lock
statements中来同步这些调用。
如果您使用的是ConcurrentQueue<T> Class,则该队列是线程安全的,并为您进行同步。
答案 1 :(得分:2)
如果您使用的是框架4或更高版本,那么更好的选择是使用专为生产者/消费者模式设计的BlockingCollection(默认情况下它内部是ConcurrentQueue)。它允许您轻松地协调线程之间的生产和消费,而无需过多考虑锁/监视器。只需使用GetConsumingEnumerable()即可使用项目而无需任何其他手动同步工作。 MSDN Example