当一个简单的线程运行时只有一个无限循环导致100%的CPU,这怎么可能?
我的线程调用如下在Qt对话框类中的QEvent,单击按钮时说出。
pthread_t thread_id;
pthread_create( &thread_id, NULL, DataCollectionThread, (void*) this );
我的线程程序是,
void* DataCollectionThread( void* pParam )
{
((m_DataCollection*)pParam)->m_ReadDatafromport();
return NULL;
}
此ReadData()
包含...
while(1)
{
}
我的要求是从串口收集数据并连续绘制图表。但由于CPU使用率为100%,绘图之间的任何硬件中断都会导致绘图停止,因为CPU
会将任务切换为处理中断。
我在基于Qt::Dialog
的类中调用此线程。我很确定除此之外什么都不会被触发。这有什么问题?简单的无限循环会导致100%的CPU消耗吗?或者在Qt中使用pthread_create有什么问题吗?
编辑:适用于Jonathon Reinhart
这是实际的while循环
while( 1 )
{
while(( Dataisavailable))
{
//push the read data to stack
}
if(!m_DataReadable)
break;
}
答案 0 :(得分:2)
与cooperative multitasking不同,真正的OS支持的线程允许CPU中断这样锁定的代码。因此,您的计算机并非完全死亡。但是会发生一些退化。如果有工作要做的话,计算机没有很好的方法知道不要尽力运行它给出的代码...缺少nice等调度工具
有时你可以通过"线程优先级"来缓解由此类问题引起的问题。 Qt有QThread::setPriority()抽象,但请注意:
优先级参数的效果取决于操作系统的调度策略。特别是,在不支持线程优先级的系统上将忽略优先级(例如在Linux上,有关详细信息,请参阅http://linux.die.net/man/2/sched_setscheduler。)
似乎Qt人员在linux和gave up下查看了线程优先级。因此,如果这是您的平台,那么您可能应该只设计您的系统,使其不会像这样旋转。
如果您将ReadData()
更改为...
QMutex dummy;
while(1)
{
QMutexLocker locker (&dummy);
}
(这是我尝试使用@jweyrich刚才提到的sched_yield
更有效的方法。)
答案 1 :(得分:1)
YES。
while(1) { }
将要执行以下操作:
1. Does the number 1 equate to true?
2. Yes.
3. Go to 1.
只要该线程正在执行,CPU就会继续执行此操作。你为什么要开始一个线程只是为了把它放在一个什么都不做的旋转循环中?
答案 2 :(得分:1)
一个简单的黑客来解决这个问题:进入休眠状态(短暂)以让CPU做其他事情。 #include <ctime>
并在循环中添加:
struct timespec ts;
ts.tv_sec=0;
ts.tv_nsec=10000000; // 10 milliseconds
nanosleep(&ts, NULL);
当然,如果你有明确的睡眠状态会更好,直到你有实际的工作要做(更多的输入读取,一个完整的队列来修剪)。但是加入短暂的睡眠可能就足够了。
查看m_pDataProvider
对象的实现可能有意义。检查或添加允许您睡眠的方法,直到有更多数据。如果您只是从字符设备上阅读(例如ttyS0),那么poll
或select
可能会有用。