2011-10-20 77 views
1

代表,对不起,我的远非完美的英语。pthread睡眠功能,cpu消耗

我最近用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()< endwait) usleep(200); 但是,当函数休眠(和睡眠也)缝冻结时钟增量(它总是一个恒定的值后,休眠)。

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

这里它并不那么重要,我可以检查状态检查的执行花了多长时间(先锁住clock(),然后再比较),然后计数该值作为usleep函数的参数。但在其他线程中,我想使用这种形式。

睡眠是否让整个过程冻结?

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

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

J.L.

回答

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

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

2

如果不需要正好1秒,然后就usleep第二。睡眠和睡眠将当前线程置于有效等待状态,该状态至少是您请求的时间量(然后它有资格再次进行调度)。

如果你不是想要接近确切的时间,那么不需要检查clock()。

+0

没错。只需用'sleep(1);'替换'while()'循环。 – caf