最近、ウォールクロックを参考にして25ミリ秒待機する待機関数を作成しようとしています。私は周りを見回して「gettimeofday」を見つけましたが、私はそれで問題を抱えていました。私のコード(簡略化):
while(1)
{
timeval start, end;
double t_us;
bool release = false;
while (release == false)
{
gettimeofday(&start, NULL);
DoStuff();
{
gettimeofday(&end, NULL);
t_us = ( (end.tv_sec - start.tv_sec) * 1000*1000) + (end.tv_usec - start.tv_usec);
if (t_us >= 25000) //25 ms
{
release = true;
}
}
}
}
このコードはスレッド (Posix) で実行され、単独で正常に動作します。DoStuff() は 25ms ごとに呼び出されます。ただし、可能な場合はすべての CPU を消費するため (ご想像のとおり)、明らかにこれは良い考えではありません。
Sleep(1); を追加して調整しようとしたとき。if ステートメントの後の待機ループでは、全体が約 50% 遅くなります (つまり、約 37 ミリ秒ごとに DoStuff が呼び出されます。これは私には意味がありません。DoStuff と他のスレッドが (25 - 1) ミリ秒 DoStuff の呼び出されたレートは影響を受けません (1 ミリ秒のエラー マージンを許容)
Sleep(0)、usleep(1000)、usleep(0) も試しましたが、動作は同じです。
優先順位の高い別のスレッドが CPU 時間を必要とするときはいつでも、同じ動作が発生します (スリープなし)。スレッドがランタイムを放棄すると、時計のカウントが停止するかのようです。
gettimeofday は NTP の更新などに対して脆弱であることを認識しています。
誰かが私が間違っていることを知っていますか?