队列条目广播到多个线程

时间:2012-07-31 21:40:07

标签: multithreading algorithm data-structures queue producer-consumer

我有一个生产者线程,它生成对象并将其放在共享队列中。

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

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

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

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

执行此预订的一种方法是使用Map,其中键是对象,值是worker-id的集合(它可以是线程ID)。

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

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

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

由于

1 个答案:

答案 0 :(得分:2)

我的建议:

  • 每个消费者都有一个队列,
  • 将所有消费者要处理的新项目推送到所有队列
  • 将其他项目推送到最短的队列,w.r.t。对象的数量(向上和向下计数信号量......)

如果您想要花哨,可以通过其他指标确定最短队列,例如:累积的对象大小或特定消费者的一些定制服务质量。