Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/spring-mvc/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Multithreading 向多个线程广播的队列条目_Multithreading_Algorithm_Data Structures_Queue_Producer Consumer - Fatal编程技术网

Multithreading 向多个线程广播的队列条目

Multithreading 向多个线程广播的队列条目,multithreading,algorithm,data-structures,queue,producer-consumer,Multithreading,Algorithm,Data Structures,Queue,Producer Consumer,我有一个生成对象并将其放入共享队列的生产者线程 我已经产生了一堆消费者线程,可以从这个队列中读取 在理想情况下,我的每个员工都会从队列中挑选下一份工作。但是对于某些对象(具有特定属性),我的每个消费者线程都需要该对象的副本(没有任何副本) 我的第一个冲动是在每次推送到队列之前检查对象的属性。如果该属性存在,则创建n个副本(此处n等于我拥有的工人数量),并将这些n个副本推送到队列中 队列将需要进行一些簿记,以防止同一工人多次获取对象 执行此簿记的一种方法是创建一个映射,其中键是对象,值是工作者id

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

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

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

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

队列将需要进行一些簿记,以防止同一工人多次获取对象

执行此簿记的一种方法是创建一个映射,其中键是对象,值是工作者id集(可以是线程id)

对于每个pop请求,队列将检查对象是否已由当前线程id处理。如果线程id存在于映射中,则它将退出关键部分,而不会从队列中弹出对象,否则它将弹出对象并更新映射

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

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

谢谢

我的建议:

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

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

这是一个好主意。根据生成的工人数量,我可以为每个工人创建一个队列,然后将项目推送到每个队列。唯一的问题是,队列的数量将随着消费者的数量成比例增加。一千个工人…一千个队列。但我认为这是一个比另一个更好的主意,制作一千份,并实施一个复杂的簿记机制,将其分散到消费者中。