【发布时间】:2019-06-19 15:21:16
【问题描述】:
我有一个有趣的生产者-消费者衍生产品要实现,我无法完全理解它的算法。因此,每个 生产者 都会在给定范围(最小值、最大值)之间“生成”数字,这会同样提醒除以给定的“商”。 消费者也是如此。
额外要求:有限缓冲区。
我对此的看法:
- 使用锁和两个条件进行推送和弹出的粗粒度队列以及用于确定队列的预期方和到达方的数量仍然可供消费者使用。 (如果队列中仍有项目或有活动的写入者(到达!= 预期),则认为队列可用)
- 一个“生产者类”,其中包含最小值、最大值、商和共享队列作为字段,并具有根据给定字段生成和返回值的方法。
- 一个“Consumer”类,它包含与“Producer”类相同的字段,并具有“consume”方法,该方法从队列中弹出一个项目并“使用”(打印出来)它。只要队列可用,消费者就会消费。
我的问题:
- 如何确保给定工作负载间隔(开始、结束)之间的所有数字都将由 x 个生产者和 y 个消费者 (x != y) 生产和消费?
- 如何实现消费机制?
- 如何对生产者和消费者的值进行分区,以便使用工作负载间隔的所有值?
我正在考虑为“缓冲区”使用数组列表,每个消费者都会执行无锁查找以查找要使用的“兼容”元素,如果一个元素可用则删除一个元素,如果没有可用元素则重试。我认为这将是低效的,因为“尝试”会浪费 CPU 周期。
PS:我正在使用 java,但伪代码也很好。
提前致谢!
【问题讨论】:
标签: java concurrency partitioning producer-consumer java-threads