質問

私のアプリケーションでは、私が使用している人々です clock_gettime(CLOCK_MONOTONIC) フレーム間のデルタ時間を測定するため(ガメドエフの典型的なアプローチ)と時々、私は奇妙な行動に直面しています clock_gettime(..) - 返された値は時折単調ではありません(つまり、前に時間がかかります。 大きいです 現在の時よりも)。

現在、そのようなパラドックスが発生した場合、私は単に現在のフレームをスキップして、次のフレームの処理を開始します。

問題は、これがどのように可能であるかということです。 Linux Posixの実装のバグですか clock_gettime? Ubuntu Server Edition 10.04(Kernel 2.6.32-24、x86_64)、GCC-4.4.3を使用しています。

役に立ちましたか?

解決

man clock_gettime 言う:

clock_monotonic_raw (Linux 2.6.28以降、Linux固有)

clock_monotonicと同様ですが、NTP調整の対象ではない生のハードウェアベースの時間へのアクセスを提供します。

以来 CLOCK_MONOTONIC_RAW NTP調整の対象ではないと思います CLOCK_MONOTONIC になり得る。

2.6.18カーネルといくつかの特定のイタニウムプロセッサを備えたRedhat Enterprise 5.0で同様の問題がありました。同じOSで他のプロセッサでそれを再現することはできませんでした。 RHEL 5.3で、わずかに新しいカーネルといくつかのRedhatパッチを使用して修正されました。

他のヒント

のインスタンスのように見えます

commit 0696b711e4be45fa104c12329f617beb29c03f78
Author: Lin Ming <ming.m.lin@intel.com>
Date:   Tue Nov 17 13:49:50 2009 +0800

timekeeping: Fix clock_gettime vsyscall time warp

Since commit 0a544198 "timekeeping: Move NTP adjusted clock
multiplier to struct timekeeper" the clock multiplier of vsyscall is updated with
the unmodified clock multiplier of the clock source and not with the
NTP adjusted multiplier of the timekeeper.

This causes user space observerable time warps:
new CLOCK-warp maximum: 120 nsecs,  00000025c337c537 -> 00000025c337c4bf

見る ここ パッチの場合。これは2.6.32.19に含まれていましたが、Debianチーム(?)によってバックポートされていない可能性があります。チェックアウトする必要があります。

試す CLOCK_MONOTONIC_RAW.

確かに私にはバグのように聞こえます。おそらく、あなたはそれを報告する必要があります Ubuntuのバグトラッカー.

Linuxのバグです。単調なクロックにajustmentが後方に進むことはできません。非常に古いカーネルと非常に古い分布を使用しています。

編集:フレームをスキップする必要がありますか? clock_gettimeをもう一度呼び出すと、どうなりますか?

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top