2011-10-20 75 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