Clock_nanosleep() 尚不支持 CLOCK_MONOTONIC_RAW。这该如何处理呢?

2024-04-20

现在clock_nanosleepDebian Jessie 上的 CLOCK_MONOTONIC_RAW 返回 EOPNOTSUPP。

如何解决该问题并补偿可能应用于计时器循环中的 CLOCK_MONOTONIC 的 NTP 调整?

Is clock_nanosleep本身也受到NTP调整的影响?如果在睡觉时进行调整,将会clock_nanosleep睡的时间比预期的要长吗?

在我的具体情况下,我是否应该担心可能的 CLOCK_MONOTONIC NTP 调整?考虑到我的代码将在没有实时时钟的系统上运行并且可能会不时失去互联网连接,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_MONOTONIC_RAWclock_nanosleep还没有实施吗?这是否意味着 CLOCK_MONOTONIC 对于大多数情况来说就足够了,甚至对于音频/视频同步也是如此?


CLOCK_MONOTONIC是单调的。它不受来自 ntp 或其他方式的任何跳转的影响。它唯一受到影响的是漂移率调整,通常由 ntpd 通过adjtime或类似的。对于较短的时间间隔,这种调整根本不可见。无论如何,只要你的系统没有被恶意配置,就足够了更准确 than CLOCK_MONOTONIC_RAW。举个例子(数字是虚构的,但可能在合理范围内)CLOCK_MONOTONIC_RAW可能以每秒 999950000 纳秒的速度运行,并且CLOCK_MONOTONIC以每秒 1000001000 纳秒的速率。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Clock_nanosleep() 尚不支持 CLOCK_MONOTONIC_RAW。这该如何处理呢? 的相关文章

随机推荐