[英]Clock_nanosleep() does not yet support CLOCK_MONOTONIC_RAW. How to deal with this?
目前clock_nanosleep
与Debian的杰西CLOCK_MONOTONIC_RAW返回EOPNOTSUPP。
如何解决该问题并补偿可能在计时器循环中应用于CLOCK_MONOTONIC的NTP调整?
clock_nanosleep
本身也会受到NTP调整的影响吗? 如果在睡眠时进行调整, clock_nanosleep
睡眠时间是否会clock_nanosleep
预期的更长?
我是否应该担心在我的特定情况下可能对CLOCK_MONOTONIC NTP进行的调整? 考虑到我的代码将在没有实时时钟的系统上运行并且可能会不时失去Internet连接,那么NTP应用于CLOCK_MONOTONIC的最大可能的“时间跳跃”是什么?
长话短说。 我正在使用一个简单的循环来模拟音频文件的播放,并且我需要保持一致的播放位置。
clock_nanosleep
与TIMER_ABSTIME标志似乎精细做的工作,但我不知道,如果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_nanosleep
支持? 这是否意味着CLOCK_MONOTONIC在大多数情况下就足够了,甚至对于音频/视频同步也是如此?
CLOCK_MONOTONIC
是单调的。 它不受ntp或其他任何因素的影响。 唯一要经过的是漂移速率调整,通常由ntpd通过adjtime
或类似方法完成。 对于较短的时间间隔,此调整将根本看不到。 在任何情况下,只要您的系统没有被恶意配置,它都比CLOCK_MONOTONIC_RAW
更加准确 。 作为一个例子(由数字组成,但它们可能在合理范围内), CLOCK_MONOTONIC_RAW
运行速度可能为每秒999950000纳秒,而CLOCK_MONOTONIC
的运行速度为每秒1000001000纳秒。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.