我找到了一个时间函数,可以保证为不同的调用返回不同的值。我在LINUX上尝试了下面的方法,但发现它不是我想要的,它可能会为来自不同线程的调用返回相同的值。
long GetTickCount()
{
struct timespec now;
clock_gettime(MONOTONIC, &now);
return now.tv_sec * 1000000000LL + now.tv_nsec;
}
在LINUX上还有其他办法吗?
答案 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;
}
由于您希望多线程可靠,因此您需要使用全局互斥锁(上面带有“临界区域”注释的区域)来保护全局计数器。