0

我有一个生成器线程可以生成对象并将其放入共享队列中。将队列条目广播到多个线程

我已经产生了一堆消费者线程,可以从这个队列中读取。

在理想情况下,我的每一位员工都会从队列中选择下一份工作。但是对于某些对象(具有某个属性),我的每个消费者线程都需要该对象的副本(没有任何重复项)。

我的第一个冲动是在每次推入队列之前检查对象的属性。如果属性存在,则创建n个副本(这里n等于我拥有的工作人员的数量),并将这n个副本推送到队列中。

该队列将需要做一些簿记,以防止同一个工人不止一次获得对象。

执行此簿记的一种方法是创建一个Map,其中键为对象,值为worker-id(它可以是线程ID)。

对于每个弹出请求,队列将检查对象是否已被当前线程ID处理。如果线索ID存在于地图中,它将退出临界区而不从队列中弹出对象,否则将弹出对象并更新地图。

这种方法的问题在于,很可能单个线程可能使其他线程无法访问队列。

有人可以提出一个优雅的方式来解决这个问题?

感谢

回答

2

我的建议:

  • 对每个消费者提供一个队列,
  • 推新的项目要由所有的消费者来处理所有的队列,
  • 推动其他项目到最短的队列,wrt对象的数量(计数信号量上下...)

如果你想要去的幻想,你可以通过一些其他指标,例如确定最短队列累积的对象尺寸或特定消费者的一些定制服务质量。

+0

这是一个好主意。根据产生的工作人员数量,我可以为每个工作人员创建一个队列,然后将该项目推送到每个队列。唯一的问题是,排队的数量将随着消费者的数量成比例地增加。千名工人......千列队。但我认为这是一个比替代方案更好的主意,制作了一千份副本并实施了一套复杂的簿记机制,将其分散到消费者当中。 – 2012-08-01 02:58:14