阻止线程占用所有资源

时间:2014-10-31 11:52:29

标签: c++ multithreading qt

我在QT中编写了一个程序,使用几个线程在后台执行重要的操作。该程序的目标是BeagleBone Black(单核CPU)。但是在我的计算机测试中(VM,i7的4个核心),单独的线程已经占用了四个核心中的两个(如htop中所示)(可能是因为其中两个核心正在运行while(condition){}-loop)。如何防止这些线程占用我的所有资源,这样我就可以在没有单核arm-cpu的速度损失的情况下运行这个多线程程序?如何找出哪些线程占用了我所有的cpu资源?

2 个答案:

答案 0 :(得分:3)

当你使用Qt时,让线程等待的可能性更大。你确实可以使用QWaitCondition s。

这允许您使线程阻塞,直到在另一个线程中满足某个条件为止。然后,该线程可以通知正在等待满足条件的所有线程,然后唤醒它们,或者根据您的需要唤醒它们(尽管通过一个QWaitCondition您无法确定/预测哪一个将通知,这取决于操作系统。)

如果您需要有关此主题的更一般资源(闲置),我邀请您阅读更全面地介绍此主题的文章In praise of idleness

答案 1 :(得分:1)

除了使用waitConditions之外,您还可以使用事件循环对代码进行排序

需要发生的是每个函数的形式为:

void Worker::foo(){
    //some code
    while(!stop_condition){}
    //other code
}

void Worker::signalCondition(){
    stop_condition=true;
}

必须翻译成:

void Worker::foo(){
    //some code

}

//actual slot called with queuedConnection
void Worker::signalCondition(){
    //other code
}

这意味着需要将Worker移动到另一个线程,否则将在错误的线程上调用signalCondition。

诚然,使用QWaitConditions的代码更改更简单:

void Worker::foo(){
    //some code
    {
        QMutexLocker locker(&mutex);
        while(!stop_condition){
            waitCondition.wait(&mutex);
        }
    }
    //other code
}

void Worker::signalCondition(){
    QMutexLocker locker(&mutex);
    stop_condition=true;
    waitCondition.wakeOne();
}