【问题标题】:For single-producer, single-consumer should I use a BlockingCollection or a ConcurrentQueue?对于单一生产者、单一消费者,我应该使用 BlockingCollection 还是 ConcurrentQueue?
【发布时间】:2011-07-02 11:14:59
【问题描述】:

对于单一生产者、单一消费者,我应该使用 BlockingCollection 还是 ConcurrentQueue?

关注点:

  • 我的目标是一次提取多达 100 个项目并将它们作为批次发送到下一步。
  • 如果我使用 ConcurrentQueue,我必须在没有工作要做时手动使其进入休眠状态。否则我会在旋转上浪费 CPU 周期。
  • 如果我使用 BlockingQueue 而我只有 99 个工作项,它可能会无限期地阻塞直到第 100 个工作项到达。

http://msdn.microsoft.com/en-us/library/system.collections.concurrent.aspx

【问题讨论】:

  • 这是一个单生产者、单消费者的场景。或者换句话说,一个线程正在写入队列,一个线程正在从队列中读取。

标签: multithreading concurrency .net-4.0


【解决方案1】:

您可能都可以使用其中任何一个。尽管就像您说的那样,如果使用ConcurrentQueue,那么您将不得不在队列为空时执行旋转等待。如果您期望生产者和消费者之间的延迟很短,那可能还不错。最后,我认为您会发现BlockingCollection 更适合您的场景。毕竟,它是生产者-消费者模式的首选数据结构。有几种不同的方法可以解决无限期等待问题。

  • 使用标记值作为消费者的停止指标。插入队列的null 值在这里可以正常工作。
  • 利用CancellationToken 机制解除对Take 方法的阻塞。

【讨论】:

    【解决方案2】:

    【讨论】:

    • 他好像没有使用Java。
    猜你喜欢
    • 2011-12-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-02-24
    • 2015-04-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多