并行线程睡眠功能,CPU消耗(pthread sleep function, cpu consump

2019-09-27 03:04发布

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

我最近写了我的自我用于Linux的恶魔(确切的OpenWRT路由器)在C ++中,我来到了问题。

那么有几个线程那里,每一个打开的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一直做检查经过的时间。 我试着做做这样的事情:而(时钟()<endwait)usleep(200); 但是在函数usleep(和睡眠也)缝冻结时钟增量(它总是usleep后的恒定值)。

是否有任何解决方案,准备功能(如phread_sleep(20毫秒)),或走动我的问题? 也许我应该以某种方式进入主时钟?

在这里它不是那么重要我几乎可以(前锁定时钟(),与之后相比)检查多久做的状态执行了检查,并计算值把作为参数传递给usleep功能。 但在其他线程,我想用这种形式。

不要usleep是把整个过程冻结?

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

感谢您的任何答案,并建议其大加赞赏。

JL

Answer 1:

如果不需要正好1秒,然后就usleep第二。 usleep和睡眠把当前线程成至少是你的要求(然后变得适合被再次定)时间量的有效等待状态。

如果你不试图获得接近准确的时间有没有必要检查时钟()。



Answer 2:

我有我有别的办法解决它。

#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;
}

裸记住,这个代码是脆弱的执行过程中时间的变化。 不要有想法如何省略,但在我的情况下,它并不重要。



文章来源: pthread sleep function, cpu consumption