1

Linux 2.6.26 システム (Debian 5.0.5) で短いタイムアウトを設定しsetitimer、設定値を (getitimerまたは別ので) クエリすると、設定した値よりも高い値が返されます。setitimer

#include <sys/time.h>
#include <iostream>

int main() {
  struct itimerval wanted, got;

  wanted.it_value.tv_sec     = 0;
  wanted.it_value.tv_usec    = 7000;
  wanted.it_interval.tv_sec  = 0;
  wanted.it_interval.tv_usec = 0;

  setitimer(ITIMER_VIRTUAL, &wanted, NULL);
  getitimer(ITIMER_VIRTUAL, &got);

  std::cerr << "we said: " << wanted.it_value.tv_usec << "\n"
            << "linux set: " << got.it_value.tv_usec << std::endl;

  return 0;
}

戻り値:

we said: 7000
linux set: 12000

いくつかの計算の後に残っていると報告された時間を使用しているため、これは問題があり、それらも大きすぎます。

これは既知の問題ですか? (グーグルは機能しませんでした。)誰かが良い回避策を持っていますか?

4

1 に答える 1

1

関数POSIXドキュメントにsetitimerは、メモがあります

実装は、タイマー値の粒度に制限を設ける場合があります。インターバルタイマーごとに、要求されたタイマー値が実装でサポートされているよりも細かい粒度を必要とする場合、実際のタイマー値は次のサポートされている値に切り上げられます。

システムの粒度は 1000 usec (6000 usec のようです) よりも高いようで、タイマー値は切り上げられます。そのような精度が必要な場合、タイマーの粒度が問題になります。

于 2011-07-29T13:01:06.617 に答える