在网络编程时通常会使用到死循环来接收数据,因为socket接收是阻塞形式的,所以不会抢夺其余线程的cpu资源。但在我做下列工作时发现,当我不使用阻塞式的死循环时,在线程不满足条件进入死循环(空循环)后会出现cpu大量占用情况,代码如下:
while (1) //死循环
{
if (m_frameQueue.size() > 0) //判断条件
{
//业务操作
}
//不满足条件会进入无限的空循环中,cpu使用率陡增
}
如果不满足条件可以直接结束线程倒也没有此问题,但很多时候即使不满足判断条件也要继续使用线程循环,实现阻塞的效果。如果一直在空循环中,线程状态会一直处于running,cpu调度时会一直优先给与此线程资源,即便这个线程什么也没有做,所以解决办法是用Sleep进行短时间阻塞释放资源。即添加如下:
Sleep(1);
这样当条件不满足线程变成空循环后,通过Sleep可以有效释放资源,占用率会降到非常低。最终代码:
while (1) //死循环
{
if (m_frameQueue.size() > 0) //判断条件
{
//业务操作
}
Sleep(1);//不满足条件会进入无限的空循环中,阻塞1毫秒释放资源
}