能否通过单次调用同时获取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
相关产品推荐
相关产品推荐

