我正在尝试使用Multithreads实现一种新的调度技术。每个线程都有自己的私有本地队列。这个想法是,每次从程序线程创建任务时,它应该在队列中搜索最小队列大小(任务数量较少的队列)并将其排入队列。 一种在线程之间进行负载均衡的方法,其中较少繁忙的队列排队更多。
请您建议一些逻辑(或)想法如何在编程的角度动态地找到给定队列中的最小大小队列。
我正在使用Visual Studio 2008,在我们自己的多线程库中实现C ++编程语言,实现多速率同步数据流范例。
答案 0 :(得分:1)
正如您所看到的那样,尝试查找负载较少的队列非常麻烦并且可能是一种效率低下的方法,因为您可能会向只有一个繁重任务的队列添加更多工作,而具有小任务的队列将拥有更多作业并且变得非常不活跃。
你最好使用工作窃取启发式:当线程完成自己的工作时,它将查看其他线程队列并“窃取”某些工作而不是保持空闲或者是终止。
然后系统将自动平衡,每个线程都处于活动状态,直到每个人都没有足够的工作。
你不应该有空闲线程和工作等待处理的情况。
答案 1 :(得分:0)
为什么线程不从“主”工作队列中获取工作?
如果您真的尝试将工作项从主源分发到一组工作者,那么您正在进行负载平衡,正如您所说。在这种情况下,你真的在谈论调度,除非你只是进行循环风格平衡。调度是计算中非常深入的主题,您可以轻松地花费数周或数月的时间来学习它。
答案 2 :(得分:0)
如果你真的想尝试这个,那么每个队列是不是只保留一个公共的'int count'成员,在推送/弹出任务时用atomic inc / dec更新?
这个设计是否值得管理开销和偶然的“错误”当一个任务排队到一个线程时,当另一个线程正要将一个非常短的工作出列时,该线程碰巧正在运行一个特别冗长的工作,是另一个问题。
答案 3 :(得分:0)
您可以在线程之间同步计数器。但我猜这不是你想要的。
由于您希望使用数据流实现所有内容,因此所有内容都应该是队列。
您的第一个选择是查询队列中的作业数。我认为这并不容易,如果你想要一个读/写模式,因为你可能不得不使用锁来进行这个操作,这不是你想要的。注意:我只是在猜测,你不能在这里使用无锁队列;要么你有一个计数器,要么取两个指针的差异,无论你有锁定。
您的第二个选项(可以使用无锁代码完成)是将命令发送回调度程序线程,告诉他工作线程x已经消耗了一个作业。使用这种方法,您将有更多队列,每个队列从一个工作线程到调度程序线程。