You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

能否通过单次调用同时获取CLOCK_REALTIME与CLOCK_MONOTONIC时间值

回答

能否单次调用同时获取两个时钟的同刻取值?

标准POSIX定义的clock_gettime()接口不支持单次调用返回多个时钟的取值,当前Linux内核也没有提供对应的原生系统调用可以同时拿到CLOCK_REALTIME和CLOCK_MONOTONIC的同一时刻快照。

两次调用clock_gettime()的误差顾虑是否合理?

这个顾虑在理论上成立,但对你的实际场景影响极小:

  • 现代Linux系统中,clock_gettime()是通过VDSO(虚拟动态共享对象)实现的,不需要陷入内核态,单次调用耗时仅为几十纳秒级别,两次调用的间隔通常不超过100ns,这个间隔内发生时钟跳变的概率几乎可以忽略。
  • 你要检测的是CLOCK_REALTIME和GPS同步产生的跳变,这类跳变的量级最小也是微秒级起步,远大于两次调用的纳秒级误差,完全不会影响跳变识别的准确性。

如果确实要进一步压缩两个时钟取值的时间差,可以用循环校验的方案确保采样间隔在可控范围内,示例代码如下:

#include <time.h>

// 计算两个timespec的差值,单位纳秒
static long long timespec_diff_ns(const struct timespec *a, const struct timespec *b) {
    return (long long)(a->tv_sec - b->tv_sec) * 1000000000LL + (a->tv_nsec - b->tv_nsec);
}

void get_aligned_clocks(struct timespec *rt, struct timespec *mono) {
    struct timespec rt_end;
    do {
        clock_gettime(CLOCK_REALTIME, rt);
        clock_gettime(CLOCK_MONOTONIC, mono);
        clock_gettime(CLOCK_REALTIME, &rt_end);
    // 两次REALTIME采样差小于100ns则认为两次采样的时钟值是对齐的
    } while (timespec_diff_ns(&rt_end, rt) > 100);
}

内容的提问来源于stack exchange,提问作者Blutkoete

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.24 08:06:03