具有间隔分区的生产者-消费者

时间:2019-01-25 18:49:58

标签: java concurrency partitioning producer-consumer java-threads

我有一个有趣的生产者-消费者衍生产品可以实现,而且我不能全神贯注于它的算法。因此,每个生产者都将“产生”给定范围(最小,最大)之间的数字,从而对除以给定的“商”给出相同的提示。 消费者也是如此。

额外要求:有限的缓冲区。

我对此的看法:

    使用锁定和两个条件进行推入和弹出的粗粒度队列,以及用于确定队列的许多预期方和到达方,仍然可供消费者使用。 (有人认为如果队列中仍然有项目或有活跃的作者(到达!=预期),则该队列可用)
  • “生产者类”,其中包含最小值,最大值,商数和共享队列作为字段,并具有根据给定字段生成和返回值的方法。
  • “ Consumer”类,它包含与“ Producer”类相同的字段,并具有“ consume”方法,该方法从队列中弹出一个项目并“消费”(打印)该项目。只要队列可用,消费者就会消费。

我的问题:

  • 如何确保给定工作负载间隔(开始,结束)之间的所有数字都由x个生产者和y个消费者(x!= y)生产和消费?
  • 一个人将如何实现消费机制?
  • 一个人将如何对生产者和消费者的价值进行划分,以便使用所有工作量间隔值?

我当时正在考虑为“缓冲区”使用数组列表,每个使用者都将执行无锁查找以使用“兼容”元素,如果有可用元素,则删除该元素,如果没有可用元素,则再试一次。我认为这样做会效率低下,因为在“尝试”上浪费了CPU周期。

PS :我正在为此使用Java,但是伪代码也确实很好。

谢谢!

1 个答案:

答案 0 :(得分:1)

为确保生产者产生给定范围内所有具有相同余数的数字,您可以使用以下伪代码

int current = start;
while (current++ <= end) { //assuming your ranges are inclusive
  if (current % quotient == 0) {
    publish(current);
  }
}

要支持分区,您基本上需要某种Map<YourKey, Queue>。每个生产者和消费者都将与一个密钥相关联,并且生产者将发布到与其密钥相关联的队列中,并且消费者将从与其密钥相关联的队列中进行消费。您可以将范围用作队列的键。