为什么time()报告的时间有时比C代码中timespec_get()的seconds组件晚1秒?

为什么time()报告的时间有时比C代码中timespec_get()的seconds组件晚1秒?,c,time,posix,timespec,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);

下面是一段代码:

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);
    }
}
为什么
cTime
ts.tv\u sec
之间存在差异?请注意,如果条件更改为
ts.tv\u nsec>=3000000
,则不会出现问题。问题在于纳秒小于3000000。

原因在于(隐式地)使用不同的系统时钟
timespec\u get()
使用高分辨率系统范围的实时时钟,而
time()
使用粗略的实时时钟

尝试使用

clock_gettime(CLOCK_REALTIME_COARSE, &ts);
而不是您的
timespec\u get()
,那么差异应该消失

编辑:

这一点可以在

事实上,这个问题在这里有点微妙。
CLOCK\u REALTIME\u rough
CLOCK\u REALTIME
使用的结构构件的秒部分包含相同的值,但纳秒部分不同;使用
CLOCK\u REALTIME
时,它可以大于
100000000
(1秒)。在这种情况下,它在通话中固定:

ts->tv_sec += __iter_div_u64_rem(ns, NSEC_PER_SEC, &ns);
ts->tv_nsec = ns;

此校正既不使用
CLOCK\u REALTIME\u rough
,也不使用
time()
。这解释了
CLOCK\u REALTIME
time()

之间的区别。您需要更具体地说明所使用的操作系统、版本、所使用的C库版本。@Someprogrammerdude Linux Debian 8、GCC 6.3.0。什么是
timespec\u get()
?这是C还是C++?看起来像
std::timespec\u get
。请使用适当的标记。@MarcoBonelli:它是在C11中添加到C的@ShadowRanger谢谢你的参考,我在我的系统上看不到
timespec\u get
man
条目,所以我马上下结论。有意义。这是在任何地方记录的,还是仅仅是一个
时间
的工件,用(可能)性能更高但精度更低的时钟来实现(理论上它只具有第二粒度,所以谁需要精度)?我想,当你只要求秒级的粒度时,实时延迟一毫秒左右(在线测试显示偶尔延迟超过一毫秒,但不会超过太多)并不是那么重要。@ShadowRanger我添加了一些更详细的信息没有明确的意图文档,但这已经足够详细,可以进行投票了。:-)有趣的是,时钟实际上可以报告超过一秒的额外纳秒。@ShadowRanger我找不到真正的文档,除了它的来源,这也意味着,在没有事先通知的情况下,行为也可能发生详细的变化notice@Ctx谢谢你的详细回答!我将使用timespec_get()而不是您建议的clock_gettime(),因为timespec_get()是C11而不是POSIX,并且不需要设置要使用的时钟。我不知道使用了不同的时钟,但如果有选择的话,我认为使用粗糙的时钟没有多大意义。
ts->tv_sec += __iter_div_u64_rem(ns, NSEC_PER_SEC, &ns);
ts->tv_nsec = ns;