代为抱歉,我的英语不够完美。
我最近用 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 总是在检查时间是否过去了。我试过做这样的事情: 而(时钟()<结束等待) sleep (200); 但是当函数 usleep(和 sleep 也)接缝卡住时钟增量时(在 usleep 之后它总是一个常数值)。
是否有任何解决方案、现成的函数(如 phread_sleep(20ms))或解决我的问题?也许我应该以某种方式访问主时钟?
这里它不是那么重要,我几乎可以检查状态检查的执行花了多长时间(之前锁存 clock(),与之后比较),并计算要作为参数传递给 usleep 函数的值。但在其他线程中,我想使用这种形式。
usleep 是否正在卡住整个过程?
我目前正在Cygwin 上调试它,但不认为问题出在这里。
非常感谢您的任何回答和建议。
J.L.
最佳答案
如果它不需要恰好是 1,那么请稍等片刻。 usleep 和 sleep 将当前线程置于有效等待状态,该状态至少是您请求的时间量(然后它有资格再次被调度)。
如果您不想接近准确时间,则无需检查 clock()。
关于c++ - pthread休眠函数,cpu消耗,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7830243/