伙计们,在我的应用程序中,我正在使用clock_gettime(CLOCK_MONOTONIC)
它来测量帧之间的增量时间(gamedev中的典型方法),并且我不时会遇到奇怪的行为clock_gettime(..)
- 返回的值偶尔也不是单调的(即上一次.是更大的比目前的时间).
目前,如果发生这样的悖论,我只需跳过当前帧并开始处理下一帧.
问题是这怎么可能呢?这是Linux POSIX实现中的一个错误clock_gettime
吗?我使用的是Ubuntu Server Edition 10.04(内核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和一些特定的Itanium处理器时遇到了类似的问题.我们无法在同一操作系统上使用其他处理器重现它.它在RHEL 5.3中得到修复,内核稍微更新一些,还有一些Redhat补丁.
看起来像是一个实例
commit 0696b711e4be45fa104c12329f617beb29c03f78 Author: Lin MingDate: 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
.