![](/img/trans.png)
[英]100% CPU usage when overriding QGraphicsLineItem::paint()
[英]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.