在尝试QThreadPool之前,我认为多线程程序可能会有不确定的结果,具体取决于操作系统如何安排它。 但是,我今天的意见有所改变。
以下是main.cpp的代码:
runnableInst *hInst = new runnableInst("StarWar");
runnableInst *thread = new runnableInst("BlackSmith");
QThreadPool::globalInstance()->start(hInst);
QThreadPool::globalInstance()->start(thread);
这是运行功能。
void runnableInst::run()
{
// while(1) {
for(int i = 0; i < 50; ++i) {
qDebug()<<"CurrentThread="<< QThread::currentThread();
qDebug()<<threadName + " is outputing. Count="<<i;
Sleep(100);
}
}
以下是结果的一部分。
似乎两个线程按添加到线程池的顺序运行。这是否意味着我们不会有一个随机线程执行类QThreadPool的结果?
答案 0 :(得分:3)
不,它没有..是的,确实如此:
线程调度永远不是随机的 - 它通过调度算法使用以及调度程序/调度程序运行时所有线程的状态来精确确定。在许多设计/系统/场景中,它可以显示为伪随机,但您的示例不是其中之一
在您的示例中,您的runnables执行的实际工作很少,以至于两个池线程只是交替绘制和执行它们。 99.99%的时间,两个线程在睡眠(100)呼叫时被阻止。在那段时间结束时,两个线程将获得另一个可运行的,一个稍微在另一个之前。
您看到的调度行为是示例代码的工件。您无法将其推断为其他设计和/或行为。