2011-10-20 5 views
1

代わって、完璧な英語から私の遠いため申し訳ありません。pthreadスリープ機能、CPU消費

私は最近、C++のLinux(正確なOpenWRTルーターになる)のために自分自身の悪魔を書きました。問題が発生しました。

よく開かれているTCP接続ごとに1つ、新しい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); しかし、関数usleep(とsleepも)がクロックインクリメント(usleepの後では常に定数値)をフリーズさせます。

解決策はありますか(phread_sleep(20ms)のような)機能はありますか?どういうわけか私はメインクロックにアクセスする必要がありますか?

これはあまり重要ではありませんが、私は状態チェックの実行がどれくらい前に行われたかをかなり調べることができます(clock()を前にラッチし、afterと比較します)、usleep関数の引数として値を数えます。しかし、他のスレッドでは、私はこのフォームを使用したいと思います。

usleepは全プ​​ロセスをフリーズしていますか?

私は現在Cygwin上でデバッグしていますが、ここに問題があるとは思われません。

ご回答ありがとうございました。ありがとうございます。

、それは正確に1秒である必要はありません場合は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

、そしてちょうど秒はusleep。 usleepとsleepは、現在のスレッドを、少なくとも要求した時間の効率的な待機状態にします(その後、再びスケジュールされる資格を得ます)。

時刻が近づいていない場合は、clock()を確認する必要はありません。

+0

正確に。 'while()'ループを 'sleep(1);'に置き換えてください。 – caf

関連する問題