1

当一个简单的线程运行时只有一个无限循环导致 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 有什么问题吗?

编辑:乔纳森·莱因哈特

这是实际的while循环

while( 1 )
    {

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



        if(!m_DataReadable)
            break;
      }
4

3 回答 3

2

协作多任务不同,真正的操作系统支持的线程允许 CPU 中断像这样锁定的代码。所以你的电脑并没有完全死机。但是会发生一些退化。如果有工作要做,计算机没有一个很好的方法知道不尽力运行它给出的代码......缺少像nice这样的调度工具

有时,您可以通过“线程优先级”缓解此类问题引起的问题。Qt 有一个QThread::setPriority()抽象,但请注意它说:

优先级参数的效果取决于操作系统的调度策略。特别是,在不支持线程优先级的系统上,优先级将被忽略(例如在 Linux 上,有关详细信息,请参阅http://linux.die.net/man/2/sched_setscheduler )。

似乎 Qt 人在 linux 下查看了线程优先级并放弃了。因此,如果那是您的平台,那么您可能应该只设计您的系统,使其不会像这样旋转。

我很好奇如果你换成ReadData()...

QMutex dummy;
while(1)
{
    QMutexLocker locker (&dummy);
}

sched_yield(这是我尝试用刚才提到的@jweyrich更有效地完成的事情的方式。)

于 2012-06-28T05:46:29.867 回答
1

是的。

while(1) { }

将执行以下操作:

1. Does the number 1 equate to true?
2. Yes.
3. Go to 1.

只要该线程正在执行,CPU 就会不断地执行此操作。你为什么要启动一个线程只是为了把它放在一个什么都不做的自旋循环中?

于 2012-06-28T05:23:33.320 回答
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在这里可能有用。

于 2012-06-28T05:46:10.733 回答