在线程中找到最小队列大小

Find minimum queue size among threads

本文关键字:队列 线程      更新时间:2023-10-16

我正在尝试用多线程实现一种新的调度技术。每个线程都有自己的私有本地队列。其思想是,每次从程序线程创建任务时,它应该在队列中搜索最小队列大小(任务数量较少的队列)并在其中排队。一种线程间负载平衡的方法,其中较少繁忙的队列可以更多地排队。

你能从编程的角度给出一些逻辑(或)想法如何在给定的队列中动态地找到最小大小的队列吗?

我正在visual studio 2008中工作,c++编程语言在我们自己的多线程库中实现多速率同步数据流范例。

正如您所看到的,试图找到负载较低的队列是很麻烦的,并且可能是一种效率低下的方法,因为您可能会在只有一个繁重任务的队列中添加更多的工作,而具有小任务的队列将没有更多的工作,并且很快变得不活跃。

你最好使用工作窃取启发式:当一个线程完成自己的任务时,它会查看其他线程队列并"窃取"一些工作,而不是保持空闲或被终止。

然后系统将自动平衡,每个线程都处于活动状态,直到没有足够的工作供每个人使用。

不应该出现空闲线程和工作等待处理的情况。

如果你真的想尝试这个,可以每个队列不只是保持一个公共的'int count'成员,更新与原子inc/dec作为任务推送/弹出?

这样的设计是否值得管理开销和偶尔的"错误",当一个任务排队到一个线程,碰巧正在运行一个特别长的作业,而另一个线程正要从一个非常短的作业中取出队列时,是另一个问题。

为什么线程不从'master'工作队列中获取它们的工作?

如果您真的试图将工作项从主源分发到一组工作者,那么就像您所说的那样,您正在进行负载平衡。在这种情况下,你真正谈论的是调度,除非你只是做循环式的平衡。调度是计算机中一个非常深奥的主题,您可以轻松地花费数周或数月来学习它。

可以在线程之间同步计数器。但我猜这不是你想要的。

因为你想用数据流来实现一切,所以一切都应该是队列。

第一个选项是查询队列内的作业数。我认为这并不容易,如果你想要一个单一的读/写模式,因为你可能需要为这个操作使用锁,这不是你想要的。注意:我只是猜测,您不能在这里使用无锁队列;要么使用计数器,要么使用两个指针的差值,这两种方法都是锁。

第二个选项(可以用无锁代码完成)是向调度线程发送一个命令,告诉他工作线程x已经消耗了一个作业。使用这种方法,您有n多个队列,每个队列从一个工作线程到调度线程。