目前在Debian Jessie上使用CLOCK_MONOTONIC_RAW clock_nanosleep
返回EOPNOTSUPP。
如何解决问题并补偿可能在定时器循环中应用于CLOCK_MONOTONIC的NTP调整?
clock_nanosleep
本身是否也会受到NTP调整的影响?如果在睡觉时进行调整,clock_nanosleep
会睡到预期的时间吗?
在我的具体情况下,我是否应该担心可能的CLOCK_MONOTONIC NTP调整?什么是最大可能的"时间跳跃"由NTP应用于CLOCK_MONOTONIC,考虑到我的代码将在没有实时时钟的系统上运行,并且可能会不时丢失互联网连接?
长篇故事。我使用简单的循环来模拟音频文件播放,我需要保持一致的播放位置。
带有TIMER_ABSTIME标志的 clock_nanosleep
似乎正常工作,但我不确定CLOCK_MONOTONIC是否足以避免播放位置明显跳跃。
以下是我使用的代码:
clock_gettime(CLOCK_MONOTONIC, &deadline);
// run until asked to stop
while(!need_quit(stop_mutex_signal)) {
// do stuff ...
// add time ms to previous deadline
deadline.tv_nsec += device->periodTime * NANOSECONDS_PER_MILLISEC;
// normalize the time to account for the second boundary
if(deadline.tv_nsec >= NANOSECONDS_PER_SEC) {
deadline.tv_nsec -= NANOSECONDS_PER_SEC;
deadline.tv_sec++;
}
if(clock_nanosleep(CLOCK_MONOTONIC, TIMER_ABSTIME, &deadline, NULL) != 0)
{
// something happened - error or exit signal, cannot continue
return;
}
}
我很好奇,为什么clock_nanosleep
中对CLOCK_MONOTONIC_RAW的支持尚未实现?对大多数情况来说CLOCK_MONOTONIC是否足够,即使是音频/视频同步?
答案 0 :(得分:5)
CLOCK_MONOTONIC
是单调的。从ntp或其他方面来看,它不受任何跳跃的影响。它唯一受制于漂移率调整,通常通过adjtime
或类似的ntpd来完成。对于短暂的间隔,这种调整根本不可见。在任何情况下,只要您的系统未经过恶意配置,它就会比CLOCK_MONOTONIC_RAW
更准确。作为一个例子(编号,但它们可能在合理范围内)CLOCK_MONOTONIC_RAW
可能以每实际秒999950000纳秒的速率运行,CLOCK_MONOTONIC
以每实际秒1000001000纳秒的速率运行