当一个简单的线程中运行无限循环而导致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的类中调用此线程。我很确定没有触发任何其他 Action 。这怎么了一个简单的无限循环会导致100%的CPU消耗吗?还是在Qt中使用pthread_create有任何问题?

编辑:对于Jonathon Reinhart

这是实际的while循环
while( 1 )
    {

            while(( Dataisavailable))
            {
                 //push the read data to stack
            }



        if(!m_DataReadable)
            break;
      }

最佳答案

解决此问题的一种简单方法:进入(短时间)睡眠,让CPU做其他事情。 #include <ctime>并在循环中添加:

struct timespec ts;
ts.tv_sec=0;
ts.tv_nsec=10000000; // 10 milliseconds
nanosleep(&ts, NULL);

当然,如果您可以明确地睡觉直到您有实际工作要做(读取更多的输入,修剪整个队列)会更好。但是增加短暂的睡眠可能就足够了。

查看m_pDataProvider对象的实现可能很有意义。检查或添加一种方法,使您可以进入睡眠状态,直到有更多数据为止。如果您只是从字符设备(例如ttyS0)中读取,此处pollselect可能会有用。

关于c++ - 一个简单的pthread_create导致Qt中的CPU使用率达到100%,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/11238471/

10-12 00:20
查看更多