The*_*'Or 12 c time posix timespec
以下代码片段:
struct timespec ts;
for (int x = 0; x < 100000000; x++) {
timespec_get(&ts, TIME_UTC);
long cTime = (long) time(NULL);
if (cTime != ts.tv_sec && ts.tv_nsec < 3000000) {
printf("cTime: %ld\n", cTime);
printf("ts.tv_sec: %ld\n", ts.tv_sec);
printf("ts.tv_nsec: %ld\n", ts.tv_nsec);
}
}
Run Code Online (Sandbox Code Playgroud)
产生这个输出:
...
cTime: 1579268059
ts.tv_sec: 1579268060
ts.tv_nsec: 2527419
cTime: 1579268059
ts.tv_sec: 1579268060
ts.tv_nsec: 2534036
cTime: 1579268059
ts.tv_sec: 1579268060
ts.tv_nsec: 2540359
cTime: 1579268059
ts.tv_sec: 1579268060
ts.tv_nsec: 2547039
...
Run Code Online (Sandbox Code Playgroud)
为什么之间的差异cTime和ts.tv_sec?请注意,如果条件更改为 ,则不会出现此问题ts.tv_nsec >= 3000000。该问题依赖于小于 3000000 的纳秒。
Ctx*_*Ctx 11
原因是,您(隐式)使用了不同的系统时钟。timespec_get()使用高分辨率的全系统实时时钟,同时time()使用粗实时时钟。
尝试使用
clock_gettime(CLOCK_REALTIME_COARSE, &ts);
Run Code Online (Sandbox Code Playgroud)
而不是您的timespec_get(),那么差异应该消失。
编辑:
这可以在Linux Kernel Source vclock_gettime.c 中看到
事实上,在这里看到这个问题有点微妙。CLOCK_REALTIME_COARSE和使用的结构成员的秒部分CLOCK_REALTIME包含相同的值,但纳秒部分不同;用CLOCK_REALTIME它可以大于1000000000(这是一秒)。在这种情况下,它是在调用时修复的:
ts->tv_sec += __iter_div_u64_rem(ns, NSEC_PER_SEC, &ns);
ts->tv_nsec = ns;
Run Code Online (Sandbox Code Playgroud)
此校正既不使用CLOCK_REALTIME_COARSE,也不使用time()。这解释了CLOCK_REALTIME和之间的区别time()。
| 归档时间: |
|
| 查看次数: |
145 次 |
| 最近记录: |