Frage

Folks, in meiner Anwendung verwende ich clock_gettime(CLOCK_MONOTONIC), um die Delta-Zeit zwischen den Bildern (ein typischer Ansatz in gamedev) und von Zeit zu Zeit zu messen, ich bin vor ein seltsames Verhalten von clock_gettime(..) - zurückgegebenen Werte sind gelegentlich nicht monotone (dh i. Zeit größer als aktuelle Zeit).

Zur Zeit, wenn ein solches Paradoxon geschieht ich einfach den aktuellen Frame überspringen und die Verarbeitung der nächsten beginnen.

Die Frage ist, wie dies überhaupt möglich sein kann? Ist es ein Fehler in Linux POSIX Implementierung von clock_gettime? Ich bin mit Ubuntu Server Edition 10,04 (Kernel 2.6.32-24, x86_64), gcc-4.4.3.

War es hilfreich?

Lösung

man clock_gettime sagt:

  

CLOCK_MONOTONIC_RAW (seit Linux 2.6.28; Linux-spezifisch)

     

Ähnlich wie CLOCK_MONOTONIC, sondern bietet Zugriff auf eine reine Hardware-basierte Zeit, die nicht unter NTP Anpassungen ist.

Da CLOCK_MONOTONIC_RAW nicht Gegenstand von NTP Anpassungen ist, denke ich CLOCK_MONOTONIC sein könnte.

Wir hatten ähnliche Probleme mit Redhat Enterprise 5.0 mit Kernel 2.6.18 und einigen spezifischen Itanium-Prozessor. Wir konnten es nicht mit einem anderen Prozessor auf dem gleichen Betriebssystem reproduzieren. Es wurde in RHEL 5.3 mit etwas neueren Kernel und einiges Redhat Patches behoben.

Andere Tipps

Sieht aus wie eine Instanz von

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

Siehe hier für einen Patch. Dies wurde in 2.6.32.19 enthält, kann aber nicht durch das Debian-Team zurückportiert worden ist (?). Sie sollten es überprüfen.

Versuchen CLOCK_MONOTONIC_RAW.

klingt sicher wie ein Bug zu mir. Vielleicht sollten Sie es berichten in Ubuntu Bug-Tracker .

Es ist ein Linux-Bug. Kein ajustment in einer monotonen Uhr kann es nach hinten zu gehen. Sie verwenden einen sehr alten Kernel und eine sehr alte Verteilung.

Edit: sind Sie sicher, dass Sie benötigen, um den Rahmen zu überspringen? Wenn Sie clock_gettime wieder rufen, was passiert?

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top