QThreadPool是否有序地安排其线程?

时间:2012-08-16 08:15:24

标签: c++ multithreading qt

在尝试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);
    }
}

以下是结果的一部分。 enter image description here

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

1 个答案:

答案 0 :(得分:3)

不,它没有..是的,确实如此:

线程调度永远不是随机的 - 它通过调度算法使用以及调度程序/调度程序运行时所有线程的状态来精确确定。在许多设计/系统/场景中,它可以显示为伪随机,但您的示例不是其中之一

在您的示例中,您的runnables执行的实际工作很少,以至于两个池线程只是交替绘制和执行它们。 99.99%的时间,两个线程在睡眠(100)呼叫时被阻止。在那段时间结束时,两个线程将获得另一个可运行的,一个稍微在另一个之前。

您看到的调度行为是示例代码的工件。您无法将其推断为其他设计和/或行为。