我正在使用下面的代码将纳秒转换为微秒
该代码通常运行良好,但有时我看到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
。