linux - 为并发程序生成时间戳

标签 linux unix time timestamp

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

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

使用 CLOCK_THREAD_CPUTIME_IDCLOCK_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/

相关文章:

php - 如何从 php 运行 Python 脚本

linux - 为什么我会收到 malloc 错误?

unix - Cassandra 打开的文件太多。港口死了

c - 如何使多个子进程递增并跟踪同一个全局变量

java - 使用 Y 轴时间创建 AChartEngine TimeChart

unix - Unix 上 GMT、GMT+0、GMT-0、GMT0 之间的区别

windows - 如何在正常启动后触发可启动 CD 的启动过程?

linux - 使用 wget 自动打开 URL 并保存它们

linux - 从 shell 的 HTML 文档中按名称删除元素 - Sed 命令失败

c++ - 函数中的线程在 X 时间后执行另一个函数时出现问题