2012-12-12 98 views
0

我想在多线程系统中调度任务。我的想法是每个线程都有一个本地队列,每个线程都会从本地队列中获取作业。但是当线程达到某个阈值时,它不应该获取作业,而应该将作业转移到低于阈值级别的线程。在多线程中调度任务

我的疑问是如何设置线程的阈值。

+2

有没有足够的信息在这里回答你的问题。对于初学者,您还没有指定您使用的平台或编程语言,我不知道您的“阈值”是什么意思。 –

+0

我正在使用Microsoft Visual Studio中的C++编程语言。从某种意义上说,当一个线程非常繁忙时,它不应该再取出工作,而应该将工作转移到另一个空闲的线程。这有助于在线程间进行负载平衡。我的问题就像如何设置一个线程不会接受任何工作的限制。 – Rd7

+0

请让我知道,如果它仍然不清楚,谢谢 – Rd7

回答

1

这个问题的另一种安排是让已完成队列的线程能够从其他队列中取出工作。这被称为“工作窃取”,并且是众所周知的调度算法,例如

http://citeseerx.ist.psu.edu/viewdoc/summary?doi=10.1.1.38.8905

+0

雅我知道任务窃取,但该方法是更多的开销和更大的延迟..!我提出的想法会降低两者,但我在实施 – Rd7

+1

时存在这些疑问。我不太确定我了解额外的延迟和开销涉及“工作窃取”与“工作委托”(您的模式)。你能解释一下吗? –

+0

工作盗取有时会导致'代价昂贵的远程窃取',就像线程1处于空闲状态,线程8处于繁忙状态,从第1个线程窃取第8个线程会增加我猜测的延迟。 – Rd7

0
您正在使用什么的线程库

我在我的所有线程项目TBB和Cilk Plus中使用了两个OSS库。这些更高级别的运行时提供的一个功能是,它们可以自动将任务安排到线程,从而有效利用处理器资源。运行时对负载平衡许多任务也非常有效。

www.threadingbuildblocks.org

www.cilkplus.org