为了分析并发程序中的某些事件,我需要生成时间戳。到目前为止,我使用clock_gettime
,但我遇到了一些问题,其中一些问题是因为不同的时钟问题。
使用CLOCK_REALTIME
生成的时间戳似乎与实际的事件顺序不匹配,这意味着映射到事件的结果时间戳没有任何意义。
使用CLOCK_THREAD_CPUTIME_ID
和CLOCK_PROCESS_CPUTIME_ID
时间戳的顺序是有意义的,但我期望CLOCK_REALTIME
的这种行为,而不是时钟的线程/进程相关版本。手册页指出,SMP系统可能存在虚假结果,我看不到。
我的问题是clock_gettime
是否有其他选择?如果没有,我怎么能用可用的系统时钟来解决我的误解呢?
答案 0 :(得分:1)
如果我理解正确,您正试图在多线程程序中获取事件的顺序。 Clock_gettime对于IMO来说有点过于干扰。如果您使用的是英特尔机器,为什么不直接插入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系统上它仍然是假的,因为两个芯片模块上的时钟很可能不同步。