0

我有一个生成对象并将其放入共享队列的生产者线程。

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

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

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

队列需要做一些记账,以防止同一个工作人员多次获得对象。

进行这种簿记的一种方法是拥有一个 Map,其中键是对象,值是一组 worker-id(它可以是 thread-id)。

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

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

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

谢谢

4

1 回答 1

2

我的建议:

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

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

于 2012-07-31T21:50:11.503 回答