繁体   English   中英

为什么 CPU 使用率是 100%,并且增加线程数时程序冻结?

[英]why CPU usage is 100%, and program freezing when increasing number of thread?

我有一个多线程应用程序,以便我连接传感器,(传感器的数量取决于用户)这些传感器收集数据并通过 TCP 将它们发送到我的程序。 我从 TCP 获取这些数据并进行一些复杂的计算。 之后,我将结果写入共享内存空间(对于每个传感器结果,我有不同的内存空间。)为此,我创建了 3 个不同的类(用于 TCP、计算、写入共享内存)。 并且每个类任务并行运行(task1 为TCP,task2 为计算,task3 写入)。 每个任务都必须在 while(1) 中,因为我希望每个线程都运行,直到用户完全停止程序。 如果我有一个传感器,我会创建一个 TCP 对象、一个计算对象和一个用于写入共享内存的对象,并且我为一个 TCP 创建 3 个不同的线程,一个计算和一个写入。 如果我有 2 个传感器,每个传感器有 2 个对象,每个传感器有 2 个线程,依此类推。

我的问题是,由于使用 while 循环,我的 CPU 使用率始终为 100%。 如果我有 1 或 2 个传感器,我有 3 或 6 个不同的线程,一切正常。 但是如果我有更多的传感器,例如 5,我的程序就会开始冻结。 我如何防止冻结?

我的代码基本上是;

void classTCP::threadTCP(){
    while(1){
        pthread_mutex_lock(&mutex1);
        pthread_cond_wait(&cond1, &mutex1);
        //..do_something
        pthread_mutex_unlock(&mutex1);
    }
}
void classCalculation::threadCalculation(){
    while(1){
        pthread_mutex_lock(&mutex2);
        pthread_cond_wait(&cond2, &mutex2);
        //..do_something
        pthread_mutex_unlock(&mutex2);
    }
}

void class3::thread3(){
    while(1){
        pthread_mutex_lock(&mutex3);
        pthread_cond_wait(&cond3, &mutex3);
        //..do_something
        pthread_mutex_unlock(&mutex3);
    }
}

int main()
{
    while(1)
    {
        pthread_cond_broadcast(&cond1);
        pthread_cond_broadcast(&cond2);
        pthread_cond_broadcast(&cond3);
        //...
    }
}

问题是您有很多线程正在忙于等待。 他们不会懒惰地等待输入,他们会积极寻找是否有输入。

要进行的第一个改进是消除每个传感器的过多线程。 计算线程花时间等待 TCP 线程。 同样,每个写线程等待一个计算线程,那只是一种浪费。 只需有一个包含“TCP 读取、计算、写入”循环的传感器线程。

接下来,使用 TCP 阻塞读取。 在有可用数据之前,这将占用大约 0% 的 CPU 使用率。 由于每个传感器只使用一个线程,这也意味着您使用 0% 的 CPU 进行计算和写入。

一种更现代的方法是 Boost Asio,它在有可用数据时调用您的代码。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM