伙计们,在我的应用中我正在使用 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 可能。

我们的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的错误跟踪器.

这是一个Linux错误。单调时钟中没有任何效果可以使其向后移动。您正在使用非常旧的内核和非常古老的发行版。

编辑:您确定需要跳过框架吗?如果您再次致电clock_gettime,会发生什么?

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top