Clock_nanosleep()尚不支持CLOCK_MONOTONIC_RAW。如何处理这个问题?

时间:2016-08-21 12:24:50

标签: c timer

目前在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是否足够,即使是音频/视频同步?

1 个答案:

答案 0 :(得分:5)

CLOCK_MONOTONIC是单调的。从ntp或其他方面来看,它不受任何跳跃的影响。它唯一受制于漂移率调整,通常通过adjtime或类似的ntpd来完成。对于短暂的间隔,这种调整根本不可见。在任何情况下,只要您的系统未经过恶意配置,它就会比CLOCK_MONOTONIC_RAW 更准确。作为一个例子(编号,但它们可能在合理范围内)CLOCK_MONOTONIC_RAW可能以每实际秒999950000纳秒的速率运行,CLOCK_MONOTONIC以每实际秒1000001000纳秒的速率运行