pthread睡眠功能,cpu消耗

时间:2011-10-20 01:45:14

标签: c++ pthreads sleep cpu-usage

代表,对不起我完美的英语。

我最近用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总是在检查时间过去了。我试过做这样的事情:     while(clock()&lt; endwait)         usleep(200); 但是当函数usleep(并且也是睡眠)接缝来冻结时钟增量(它在usleep之后总是一个恒定值)。

是否有任何解决方案,准备好的功能(如phread_sleep(20ms)),或者为我的问题四处走动?也许我应该以某种方式访问​​主时钟?

这里不是那么关键我几乎可以检查执行状态检查花了多长时间(之前锁定时钟(),与之比较),并计算值作为usleep函数的参数。但在其他线程中,我想使用此表单。

睡着了整个过程是要冻结吗?

我目前正在Cygwin上调试它,但不认为这里存在问题。

感谢任何答案和建议,非常感谢。

J.L。

2 个答案:

答案 0 :(得分:2)

如果它不需要精确到1秒,那么只需要睡一秒钟。 usleep和sleep将当前线程置于一个有效的等待状态,该状态至少是您请求的时间量(然后它才有资格再次安排)。

如果您没有尝试接近确切的时间,则无需检查时钟()。

答案 1 :(得分:0)

我已经以其他方式解决了这个问题。

#include <sys/time.h>
#define CLOCK_US_IN_SECOND 1000000
static long myclock()
{
    struct timeval tv;
    gettimeofday(&tv, NULL);
    return (tv.tv_sec * CLOCK_US_IN_SECOND) + tv.tv_usec;
}
void *MainThread(void* arg)
{
    Commander* commander = (Commander*)arg;
    pthread_detach(pthread_self());
    long endwait;

    while(true)
    {
        uint8_t temp;
        endwait = myclock() + (int)(1 * CLOCK_US_IN_SECOND);
        for(int i=0;i<commander->GetCount();i++)
        {
            ptrRelayBoard rb = commander->GetBoard(i);
            if (rb!= NULL)
                rb->Get(0x01,&temp);
        }
        while (myclock() < endwait)
            usleep((int)0.05*CLOCK_US_IN_SECOND);
    }
    return NULL;
}

请记住,此代码在执行期间易受时间变化的影响。不知道如何省略,但在我的情况下,它并不重要。

相关问题