我正在使用下面的代码将纳秒转换为微秒

该代码通常运行良好,但有时我看到usTick给出的值远远超出当前时间。

对于前。如果usTick中的当前时间是63290061063,则有时该值将变为126580061060。如果看到的是双精度值。

同样,我得到的另一个实例是当前时间为45960787154,但usTick显示为91920787152

typedef unsigned long long TUINT64
unsigned long long GetMonoUSTick()
{
    static unsigned long long usTick;
    struct        timespec t;
    clock_gettime(CLOCK_MONOTONIC, &t);
    usTick  =  ((TUINT64)t.tv_nsec) / 1000;
    usTick  =  usTick +((TUINT64)t.tv_sec) * 1000000;
    return usTick;
}

最佳答案

如果同一进程的多个线程并行访问变量以同时进行读/写或写/写,则这些变量需要受到保护。这可以通过使用互斥锁来实现。

在这种情况下,局部变量usTick必须按定义的static受保护。

使用POSIX线程,代码可能如下所示:

  pthread_mutex_lock(&ustick_mutex);

  usTick  =  ((TUINT64)t.tv_nsec) / 1000;
  usTick  =  usTick +((TUINT64)t.tv_sec) * 1000000;

  pthread_mutex_unlock(&ustick_mutex);


(为清楚起见,未进行错误检查)

使用前请小心正确地初始化ustick_mutex

08-16 09:47