在线程中找到最小队列大小
Find minimum queue size among threads
我正在尝试用多线程实现一种新的调度技术。每个线程都有自己的私有本地队列。其思想是,每次从程序线程创建任务时,它应该在队列中搜索最小队列大小(任务数量较少的队列)并在其中排队。一种线程间负载平衡的方法,其中较少繁忙的队列可以更多地排队。
你能从编程的角度给出一些逻辑(或)想法如何在给定的队列中动态地找到最小大小的队列吗?
我正在visual studio 2008中工作,c++编程语言在我们自己的多线程库中实现多速率同步数据流范例。
正如您所看到的,试图找到负载较低的队列是很麻烦的,并且可能是一种效率低下的方法,因为您可能会在只有一个繁重任务的队列中添加更多的工作,而具有小任务的队列将没有更多的工作,并且很快变得不活跃。
你最好使用工作窃取启发式:当一个线程完成自己的任务时,它会查看其他线程队列并"窃取"一些工作,而不是保持空闲或被终止。
然后系统将自动平衡,每个线程都处于活动状态,直到没有足够的工作供每个人使用。
不应该出现空闲线程和工作等待处理的情况。
如果你真的想尝试这个,可以每个队列不只是保持一个公共的'int count'成员,更新与原子inc/dec作为任务推送/弹出?
这样的设计是否值得管理开销和偶尔的"错误",当一个任务排队到一个线程,碰巧正在运行一个特别长的作业,而另一个线程正要从一个非常短的作业中取出队列时,是另一个问题。
为什么线程不从'master'工作队列中获取它们的工作?
如果您真的试图将工作项从主源分发到一组工作者,那么就像您所说的那样,您正在进行负载平衡。在这种情况下,你真正谈论的是调度,除非你只是做循环式的平衡。调度是计算机中一个非常深奥的主题,您可以轻松地花费数周或数月来学习它。
可以在线程之间同步计数器。但我猜这不是你想要的。
因为你想用数据流来实现一切,所以一切都应该是队列。
第一个选项是查询队列内的作业数。我认为这并不容易,如果你想要一个单一的读/写模式,因为你可能需要为这个操作使用锁,这不是你想要的。注意:我只是猜测,您不能在这里使用无锁队列;要么使用计数器,要么使用两个指针的差值,这两种方法都是锁。
第二个选项(可以用无锁代码完成)是向调度线程发送一个命令,告诉他工作线程x已经消耗了一个作业。使用这种方法,您有n多个队列,每个队列从一个工作线程到调度线程。
- 为什么我的多线程作业队列崩溃
- 在c++队列中使用pop和visit实现线程安全
- 共享队列的线程安全
- 线程安全队列 c++
- 将项目添加到队列时运行线程
- 线程安全的引用计数队列C++
- 对C++中的队列进行多线程访问
- asio::io_service 具有多个线程的优先级队列处理
- C++11如何在1个线程中使用条件变量处理2个线程安全队列
- QtThread:I/O 队列的工作线程
- 如何做 gtkmm 线程安全队列绘制?
- 线程安全队列出现分段错误
- 一个好的线程池队列大小
- 从调度队列块 [ swift / c++ ] 创建线程
- Qt的事件循环线程是安全的还是原子的?处理"队列连接"时如何同步?
- IPC Unix 消息队列线程安全吗?
- boost消息队列线程安全和进程安全吗?
- 用管道在C++中创建调度队列/线程处理程序:FIFO溢出
- 转储关键节队列(线程正在等待)
- 是否有一种方法来队列线程