【问题标题】:Blocking queue with order guarantee有订单保证的阻塞队列
【发布时间】:2021-01-04 17:00:03
【问题描述】:

我有 8 个线程来处理条状图像。条带按光栅顺序排列。当每个线程完成一个条带时,该线程将其条带 ID 号添加到阻塞队列中。我希望队列仅在数字从 0 到 N 的顺序时才允许弹出。因此,无论线程添加其 ID 的顺序如何,队列输出将为 0、1、2、3、... ..N。 STL 中是否存在具有此功能的现有构造?

我想一个简单的实现将是一个普通队列,其计数器从 0 开始。当添加 0 时,它会弹出并将计数器移动到 1,并一直弹出直到找不到匹配项。但这听起来效率低下。

编辑:如果我包装一个 STL 优先级队列使其阻塞,这可以工作。

【问题讨论】:

  • 为什么要排队?按顺序排列的元素集合称为数组。只需在每个条带完成时直接写入相应的元素即可。
  • 条带被乱序处理 - 另一个线程将它们按顺序写入磁盘。因此,一个队列。
  • 我在 Java 中遇到了类似的问题。 PriorityBlockingQueue 是不够的,因为我想阻塞直到顺序下一个项目入队。见stackoverflow.com/q/66541105/10026

标签: c++ multithreading stl queue priority-queue


【解决方案1】:

你想要的结构是一个最小堆(见std::priority_queue)。这会给出 ID 最低的元素。

每当新添加的元素位于队列的开头时,唤醒消费者线程。

一次性消耗所有顺序的元素。

【讨论】:

    【解决方案2】:

    这看起来根本不像队列!队列应该只支持 push_back 和 pop_front。里面没有偷看。

    我建议使用map<ID,image>,并保留最后处理的图像 ID。然后,您可以快速检查该地图的 front() 是否在您的序列中,并将其删除。

    【讨论】:

      猜你喜欢
      • 2014-10-16
      • 2015-08-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多