2012-08-16 62 views
0

在尝试QThreadPool之前,我认为多线程程序可能会有不确定的结果,具体取决于操作系统如何调度它。 但是,我的意见今天有所改变。QThreadPool是否有序地调度它的线程?

下面是main.cpp中的代码:

runnableInst *hInst = new runnableInst("StarWar"); 
runnableInst *thread = new runnableInst("BlackSmith"); 
QThreadPool::globalInstance()->start(hInst); 
QThreadPool::globalInstance()->start(thread); 

这里是run函数。

void runnableInst::run() 
{ 
// while(1) { 
    for(int i = 0; i < 50; ++i) { 
     qDebug()<<"CurrentThread="<< QThread::currentThread(); 
     qDebug()<<threadName + " is outputing. Count="<<i; 
     Sleep(100); 
    } 
} 

这里是结果的一部分。 enter image description here

看来,这两个线程正在按添加到线程池的顺序运行。这是否意味着我们不会有随QThreadPool类执行结果的随机线程?

回答

2

不,不...是的,它的作用:

线程调度是从来没有随机的 - 恰恰是由使用的调度算法用于和所有线程的状态,当时的调度器/调度员确定运行。在许多设计/系统/场景中,它可能会出现伪随机,但您的示例不是其中之一

在您的示例中,您的可运行程序执行的实际工作量很少,以至于两个线程池线程只是交替地绘制和执行它们。在99.99%的时间内,两个线程都在睡眠(100)通话中被阻塞。在那段时间结束时,两个线程都会得到另一个可运行的,一个稍微在另一个之前。

您看到的调度行为是您示例代码的工件。一般来说,你不能将其外推到其他设计和/或行为。

+0

你可以做的是用随机上限例如'rand()%1000000 + 1000000'(这给出一个介于1E6和2E6之间的数字)的大循环替换睡眠(100),并将一些伪造的浮动点内计算。这将为您提供从不空闲且具有不同运行时间的线程。 – rpsml 2012-08-16 10:01:51

相关问题