Linux clock gettime (часы монотонные) странное немонотонное поведение

люди, в моем приложении я использую clock_gettime(CLOCK_MONOTONIC) чтобы измерить время дельты между кадрами (типичный подход в gamedev), и время от времени я сталкиваюсь со странным поведением clock_gettime(..) - возвращаемые значения иногда не являются монотонными (i.e prev. время больше чем в текущее время).

В настоящее время, если такой парадокс происходит, я просто пропускаю текущий кадр и начинаю обрабатывать следующий.

вопрос в том, как это возможно на все? Это ошибка в реализации Linux POSIX clock_gettime? Я использую Ubuntu Server Edition 10.04 (ядро 2.6.32-24, x86_64), gcc-4.4.3.

5 ответов


man clock_gettime говорит:

CLOCK_MONOTONIC_RAW (начиная с Linux 2.6.28; специфичный для Linux)

подобно CLOCK_MONOTONIC, но предоставляет доступ к необработанному аппаратному времени, которое не подлежит корректировкам NTP.

С CLOCK_MONOTONIC_RAW не подлежит корректировке NTP, я думаю CLOCK_MONOTONIC может быть.

у нас были аналогичные проблемы с Redhat Enterprise 5.0 с ядром 2.6.18 и некоторым конкретным процессором Itanium. Мы не удалось воспроизвести его с другим процессором на той же ОС. Он был исправлен в 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 ошибка tracker.


Это ошибка linux. Никакая регулировка монотонных часов не может заставить их идти назад. Вы используете очень старое ядро и старый дистрибутив.

Edit: вы уверены, что вам нужно пропустить кадр ? Если вы снова позвоните системах, что происходит ?