为了分析并发程序中的某些事件,我需要生成时间戳。到目前为止,我使用了 clock_gettime
,但我遇到了一些问题,其中一些是由于不同时钟的问题。
使用 CLOCK_REALTIME
时,生成的时间戳似乎与事件的实际顺序不匹配,这意味着映射到事件的结果时间戳没有任何意义。
使用 CLOCK_THREAD_CPUTIME_ID
和 CLOCK_PROCESS_CPUTIME_ID
时间戳是有意义的顺序,但我预计这种行为来自 CLOCK_REALTIME
而不是线程/进程-时钟的相关版本。此外,手册页指出,SMP 系统上可能存在虚假结果,我看不到。
我的问题是是否有 clock_gettime
的替代方案,如果没有,我该如何解决我对可用系统时钟的误解?
最佳答案
如果我没理解错的话,您是在尝试获取多线程程序中事件的顺序。 Clock_gettime 对于那个 IMO 来说有点太麻烦了。如果您使用的是 Intel 机器,为什么不直接插入 rdtsc 指令。它对周期更准确,开销更小。您可以按如下方式调用 rdtsc:
static inline unsigned long long rdtsc(void)
{
unsigned hi, lo;
__asm__ __volatile__ (
"rdtsc \n"
: "=a"(lo), "=d"(hi));
return ( (unsigned long long)lo)|( ((unsigned long long)hi)<<32 );
}
顺便说一句,它在 SMP 系统上仍然是伪造的,因为两个芯片模块上的时钟很可能不同步。
关于linux - 为并发程序生成时间戳,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5954054/