gpt4 book ai didi

java - 区间分区的生产者-消费者

转载 作者:行者123 更新时间:2023-12-02 10:20:32 28 4
gpt4 key购买 nike

我有一个有趣的生产者-消费者衍生产品需要实现,但我无法理解它的算法。因此,每个生产者都会“产生”给定范围(最小值,最大值)之间的数字,这对除以给定“商”给出了相同的提醒。对于消费者来说也是如此。

额外要求:有限缓冲区。

我对此的想法:

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

我的问题:

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

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

PS:我使用 java 来实现此目的,但伪代码也非常好。

提前致谢!

最佳答案

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

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

为了支持分区,你基本上需要某种 Map<YourKey, Queue> 。每个生产者和消费者都将与一个 key 关联,生产者将发布到与其 key 关联的队列,而消费者将从与其 key 关联的队列中消费。您可以使用您的范围作为队列的键。

关于java - 区间分区的生产者-消费者,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54371229/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com