最可靠、无时钟跳变风险的微秒级时间获取方式是clock_gettime(CLOCK_MONOTONIC, ...),需链接-lrt,tv_nsec除1000转微秒,不可用CLOCK_REALTIME或gettimeofday()做间隔测量。

用 clock_gettime(CLOCK_MONOTONIC, ...) 获取高精度单调时间
Linux 下最可靠、无时钟跳变风险的微秒级时间获取方式是 clock_gettime 配合 CLOCK_MONOTONIC。它不依赖系统时间,不受 ntpdate 或手动 date 修改影响,适合做间隔测量或超时控制。
关键点:
-
struct timespec的tv_sec是秒,tv_nsec是纳秒(不是微秒),需除以 1000 转为微秒 - 必须链接
-lrt(glibc 的实时扩展库),否则链接失败报undefined reference to clock_gettime - 不要用
CLOCK_REALTIME——它会因 NTP 调整而回跳或跳变,导致时间差计算出负值
#include <time.h>
#include <stdint.h>
<p>uint64_t now_us() {
struct timespec ts;
clock_gettime(CLOCK_MONOTONIC, &ts);
return (uint64_t)ts.tv_sec * 1000000ULL + ts.tv_nsec / 1000;
}
为什么不用 gettimeofday()
gettimeofday() 返回 struct timeval,其 tv_usec 字段直接就是微秒,看似更省事。但它已被标记为 legacy,且底层仍基于 CLOCK_REALTIME,存在和 CLOCK_REALTIME 相同的问题:系统时间被调整时,两次调用可能返回递减值。
常见错误场景:
立即学习“C++免费学习笔记(深入)”;
- 在 NTP 持续同步的服务器上做耗时统计,发现“耗时”偶尔为负
- 用它实现定时器逻辑,结果触发时机漂移甚至跳过
- 与
clock_gettime(CLOCK_MONOTONIC)混用,造成时间基准不一致
除非你明确需要 wall-clock 时间(比如打日志用),否则别用 gettimeofday() 做时间差或延迟控制。
组合式C++代码评审方案,融合静态分析、AI推理、多轮迭代评审和C++专项检查,适用于PR审查、增量代码审查、全项目评审和代码质量评分,触发词包括review cpp、cpp代码评审、C++review、代码审查。
编译时忘记 -lrt 会怎样
这是 C++ 项目中高频踩坑点:代码写对了,头文件包含了,但链接时报错:
/tmp/ccABC123.o: undefined reference to symbol 'clock_gettime@@GLIBC_2.2.5' /lib64/librt.so.1: error adding symbols: DSO missing from command line
原因:glibc 将 clock_gettime 实现放在 librt 中,而 GCC 默认不链接它。解决方法只有两个:
- 编译命令末尾加
-lrt(注意顺序:目标文件在前,-lrt在后) - CMake 中用
target_link_libraries(your_target rt)
Clang 同样需要 -lrt;MSVC 不支持该函数,此方案仅限 Linux/POSIX。
微秒精度 ≠ 微秒分辨率
即使你用 clock_gettime 算出一个微秒值,硬件和内核调度也不保证每次调用都能精确到 1μs。实际分辨率取决于系统配置:
- 普通桌面/云服务器:通常 1–15 μs 分辨率(可通过
clock_getres(CLOCK_MONOTONIC, &res)查看) - 实时内核(PREEMPT_RT)+ 隔离 CPU:可压到 sub-microsecond 级,但需额外配置
- 频繁调用
clock_gettime本身有开销(几十到上百纳秒),在 tight loop 中要权衡
如果你真需要 sub-microsecond 时间戳(比如高频交易或硬件同步),得考虑 RDTSC 指令或专用硬件时钟,但那已超出通用 Linux 用户范畴。

















