抱歉,我的英语水平还差得很远。

我最近用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/

10-13 06:29