生成并发程序的时间戳

时间:2011-05-10 17:37:39

标签: linux unix time timestamp

为了分析并发程序中的某些事件,我需要生成时间戳。到目前为止,我使用clock_gettime,但我遇到了一些问题,其中一些问题是因为不同的时钟问题。

使用CLOCK_REALTIME生成的时间戳似乎与实际的事件顺序不匹配,这意味着映射到事件的结果时间戳没有任何意义。

使用CLOCK_THREAD_CPUTIME_IDCLOCK_PROCESS_CPUTIME_ID时间戳的顺序是有意义的,但我期望CLOCK_REALTIME的这种行为,而不是时钟的线程/进程相关版本。手册页指出,SMP系统可能存在虚假结果,我看不到。

我的问题是clock_gettime是否有其他选择?如果没有,我怎么能用可用的系统时钟来解决我的误解呢?

1 个答案:

答案 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系统上它仍然是假的,因为两个芯片模块上的时钟很可能不同步。