0

在尝试 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 的随机线程执行结果?

4

1 回答 1

3

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

线程调度绝不是随机的——它由使用的调度算法和调度程序/调度程序运行时所有线程的状态精确确定。在许多设计/系统/场景中,它可能出现伪随机,但您的示例不是其中之一

在您的示例中,您的可运行对象所做的实际工作很少,以至于两个池线程只是交替绘制和执行它们。99.99% 的时间,两个线程都在 sleep(100) 调用上被阻塞。在那段时间结束时,两个线程将获得另一个可运行的,一个稍微在另一个前面。

您看到的调度行为是您的示例代码的产物。您不能将其外推到其他设计和/或一般行为。

于 2012-08-16T08:50:58.207 回答