multithreading - 对于单生产者,单消费者应该使用BlockingCollection还是ConcurrentQueue?

标签 multithreading concurrency .net-4.0

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

顾虑:

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

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

    最佳答案

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

  • 将标记值用作使用者中的停止指示符。插入队列中的null值在这里可以很好地工作。
  • 利用CancellationToken机制来取消阻止Take方法。
  • 关于multithreading - 对于单生产者,单消费者应该使用BlockingCollection还是ConcurrentQueue?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2916607/

    相关文章:

    c# - 使用 NAudio 在 C# 中播放 ohLibSpotify pcm 数据流

    c# - 在任务中抛出异常时处理泄漏

    c# - 在线程中设置类的字段

    java - 我怎样才能使这段代码更并发?

    c++ - 如何使用线程每 0.3 秒发送一次消息?

    amazon-web-services - 具有 SQSEvent 和大批量大小的 Lambda 调用多个实例,每个实例处理几个项目

    concurrency - 什么进程执行rpc :cast?

    vb.net - HttpWebRequest.BeginGetResponse block ;异步获取 HttpWebResponse 的正确方法是什么?

    java - 跟踪执行线程

    multithreading - 如何使用 Caffe 启用多线程?