将队列与一个生产者和多个使用者一起使用是否安全

本文关键字:一起 使用者 安全 是否 生产者 队列 一个 | 更新日期: 2023-09-27 18:32:27

我需要在具有多个消费者的多线程情况下实现一个队列,但只有一个线程会修改队列(Enqueue)。使用队列是否安全,或者我应该考虑使用 ConcurrentQueue?

将队列与一个生产者和多个使用者一起使用是否安全

EnqueueDequeue 都是修改队列的操作。因此,如果有一个线程调用Enqueue,另一个线程调用Dequeue,则需要同步这两个调用。

  • 如果您使用的是 Queue 类,则队列不是线程安全的,您需要通过将调用包装在 lock 语句中来同步调用。

  • 如果您使用的是 ConcurrentQueue 类,则队列是线程安全的,并为您执行同步。

如果您使用的是框架 4 或更高版本,那么更好的选择是使用 BlockingCollection,它是专门为生产者/消费者模式设计的(默认情况下,它在内部是一个 ConcurrentQueue)。它使您可以轻松地协调线程之间的生产和使用,而无需过多考虑锁/监视器。只需使用 GetConsumingEnumerable() 即可使用项目,而无需任何其他手动同步工作。MSDN 示例