【问题标题】:Enqueue and TryDequeue in ConcurrentQueueConcurrentQueue 中的 Enqueue 和 TryDequeue
【发布时间】:2012-03-18 22:37:21
【问题描述】:

有一个 ConcurrentQueue 实例和两个并发访问它的线程。一个线程将项目连续入队(可能在 100 微秒内将几个项目入队),另一个线程逐项尝试出队并进行一些处理。在任何项目入队后都有一个 ManualResetEvent 向处理线程发出信号(这与这个问题不太相关)

在这种情况下,是否有可能以错误的顺序将项目添加到 ConcurrentQueue。我知道它是线程安全的,但只是想确保在入队和出队更快时它是否不会弄乱项目的顺序。

【问题讨论】:

  • '有一个ManualResetEvent来在任何项目入队后向处理线程发出信号':(
  • 这是一个队列!如果它可以重新排序条目,他们会称它为 ConcurrentBingoMachine、ConcurrentLottery、ConcurrentShoppingTrolley 或其他名称。生产者-消费者队列管道出现故障的唯一方法是存在多个消费者线程。
  • 显然,有一个“ConcurrentBag”类,所以不是 ConcurrentBingoMachine :((
  • 同意马丁的观点。也许您可以使用相关代码发布您的实际问题!
  • @MartinJames:感谢您对无序队列的命名建议。顺便说一句,您能否解释一下“生产者-消费者队列管道出现故障的唯一方法是如果有多个消费者线程。” ?

标签: c# .net multithreading thread-safety


【解决方案1】:

物品绝对不可能乱序。

首先,根据定义,队列强制执行 FIFO 顺序:您将元素放在一端,然后从另一端取出。而且由于这是由单一生产者单一消费者模式完成的,因此绝对安全。

【讨论】:

    【解决方案2】:

    这是一个队列!如果它可以重新排序条目,他们会称它为 ConcurrentBag 之类的。生产者-消费者队列管道上出现乱序的唯一方法是如果有多个消费者线程。

    【讨论】:

    • 我认为 ConcurrentShoppingTrolly 是一个更好的名字
    猜你喜欢
    • 2013-09-07
    • 2022-10-18
    • 1970-01-01
    • 2016-11-18
    • 1970-01-01
    • 1970-01-01
    • 2018-10-11
    • 2012-04-18
    • 1970-01-01
    相关资源
    最近更新 更多