Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/unix/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Linux 为并发程序生成时间戳_Linux_Unix_Time_Timestamp - Fatal编程技术网

Linux 为并发程序生成时间戳

Linux 为并发程序生成时间戳,linux,unix,time,timestamp,Linux,Unix,Time,Timestamp,为了分析并发程序中的某些事件,我需要生成时间戳。到目前为止,我使用了clock\u gettime,但我遇到了一些问题,其中一些问题是由于不同的时钟出现了问题 使用CLOCK\u REALTIME生成的时间戳似乎与事件的实际顺序不匹配,这意味着映射到事件的结果时间戳没有任何意义 使用CLOCK\u-THREAD\u-CPUTIME\u-ID和CLOCK\u-PROCESS\u-CPUTIME\u-ID时,时间戳的顺序是有意义的,但我预期这种行为来自CLOCK\u-REALTIME而不是依赖于线程

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

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

使用
CLOCK\u-THREAD\u-CPUTIME\u-ID
CLOCK\u-PROCESS\u-CPUTIME\u-ID
时,时间戳的顺序是有意义的,但我预期这种行为来自
CLOCK\u-REALTIME
而不是依赖于线程/进程的时钟版本。手册页进一步指出,SMP系统上可能存在虚假结果,我看不到


我的问题是,除了
clock\u 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 );
}
静态内联无符号长rdtsc(void)
{
未签名的hi,lo;
__asm\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu
“rdtsc\n”
:“=a”(lo),“=d”(hi));

返回((无符号长-长)低)|((无符号长-长)高)如果我理解正确,您正在尝试在多线程程序中获取事件的顺序。对于IMO来说,Clock_gettime有点太麻烦了。如果您是在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 );
}
静态内联无符号长rdtsc(void)
{
未签名的hi,lo;
__asm\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu
“rdtsc\n”
:“=a”(lo),“=d”(hi));

返回((无符号长-长)低)|((无符号长-长)高)@Aater Suelman和其他机器呢?我不想把我的分析器限制在intel机器上。当然。让我澄清一下,我的意思是说任何x86机器,intel或AMD,而不仅仅是intel。据我所知,每台机器都有某种读时间戳计数器指令。ARM有一个CP15单元,它也有同样的功能。我只是谷歌“rdtsc for ARM”。您也可以为sparc和powerPC这样做。@Aater Suleman感谢您进一步阅读和应用rdtsc。我发现:当函数不应使用时,有一些标准。重API和I/O,这意味着什么?我使用rdtsc创建时间戳,并通过套接字发送此时间戳。对于套接字,我使用boost API,但这可能是错误的不是故意的,是吗?@Aater Suelman和其他机器呢?我不想把我的分析器只限制在intel机器上。当然。让我澄清一下,我的意思是说任何x86机器,intel或AMD,而不仅仅是intel。据我所知,每台机器都有某种读取时间戳计数器指令。ARM有一个CP15单元也有同样的功能。我只是谷歌“用于arm的rdtsc"。您也可以为sparc和powerPC这样做。@Aater Suleman感谢您进一步阅读和应用rdtsc。我发现:当函数不应使用时,有一些标准。重API和I/O,这意味着什么?我使用rdtsc创建时间戳,并通过套接字发送此时间戳。对于套接字,我使用boost API,但这可能是错误的不是故意的,是吗?