代わって、完璧な英語から私の遠いため申し訳ありません。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.
正確に。 'while()'ループを 'sleep(1);'に置き換えてください。 – caf