任何时间函数保证返回不同的呼叫值

时间:2015-01-04 23:43:17

标签: c++ linux multithreading

我找到了一个时间函数,可以保证为不同的调用返回不同的值。我在LINUX上尝试了下面的方法,但发现它不是我想要的,它可能会为来自不同线程的调用返回相同的值。

   long GetTickCount()        
   {          
        struct timespec now;
        clock_gettime(MONOTONIC, &now);
        return now.tv_sec * 1000000000LL + now.tv_nsec;
   }

在LINUX上还有其他办法吗?

1 个答案:

答案 0 :(得分:2)

任何时钟都将具有有限的粒度,这可能导致连续调用返回相同的值。为了解决这个问题,您需要使用全局计数器:

static long long previous_time = 0;

long long get_strictly_monotonic_time() {
    int rc;
    struct timespec tp;
    long long t;
    rc = clock_gettime(CLOCK_MONOTONIC, &tp);
    if(rc < 0) return -1;
    t = tp.tv_sec * 1000000000LL + tp.tv_nsec;
    /* Critical region */
    if(t <= previous_time)
        t = previous_time + 1;
    previous_time = t;
    /* End of critical region */
    return t;
}

由于您希望多线程可靠,因此您需要使用全局互斥锁(上面带有“临界区域”注释的区域)来保护全局计数器。