抱歉,我的英语水平还差得很远。
我最近用C++编写了自己的Linux恶魔(确切地说是OpenWRT路由器),然后遇到了麻烦。
嗯,那里的线程很少,每个打开的TCP连接一个,主线程等待新的TCP连接,正如我所说的,命令线程检查状态。
一切正常,但我的CPU始终处于100%的状态。我现在是因为指挥官代码:
void *CommanderThread(void* arg)
{
Commander* commander = (Commander*)arg;
pthread_detach(pthread_self());
clock_t endwait;
while(true)
{
uint8_t temp;
endwait = clock () + (int)(1 * CLOCKS_PER_SEC);
for(int i=0;i<commander->GetCount();i++)
{
ptrRelayBoard rb = commander->GetBoard(i);
if (rb!= NULL)
rb->Get(0x01,&temp);
}
while (clock() < endwait);
}
return NULL;
}
如您所见,该程序每1秒钟执行一次填充。时间在这里并不重要。我知道CPU总是检查时间是否过去了。我试着做这样的事情:
而(clock() usleep(200);
但是,当函数usleep(也包括sleep)接缝以冻结时钟增量时(在usleep之后,它始终是一个恒定值)。
有什么解决方案,就绪函数(例如phread_sleep(20ms))还是解决我的问题?也许我应该以某种方式访问主时钟?
在这里不是很关键,我几乎可以检查状态检查的执行时间(锁住Clock()之前,与之后比较),并计算要作为usleep函数的参数的值。但是在其他线程中,我想使用这种形式。
usleep正在冻结整个过程吗?
我目前正在Cygwin上对其进行调试,但不要认为问题出在这里。
非常感谢您的任何回答和建议。
J.L.
最佳答案
如果不需要正好是1s,则只需睡一秒钟。 usleep和sleep将当前线程置于有效的等待状态,该状态至少为您请求的时间(然后可以再次进行调度)。
如果您不打算接近精确时间,则无需检查clock()。
关于c++ - pthread sleep 功能,cpu消耗,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/7830243/