Я нахожу функцию времени, которая гарантирует возврат разных значений для разных вызовов. Я попробовал метод ниже на LINUX, но обнаружил, что это не то, что я хочу, он может возвращать одинаковое значение для вызовов из разных потоков.
long GetTickCount()
{
struct timespec now;
clock_gettime(MONOTONIC, &now);
return now.tv_sec * 1000000000LL + now.tv_nsec;
}
Есть ли другой способ сделать это на LINUX?
Любые часы будут иметь ограниченную детализацию, что может привести к тому, что последовательные вызовы возвратят одинаковое значение. Чтобы решить эту проблему, вам нужно будет использовать глобальный счетчик:
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;
}
Поскольку вы хотите, чтобы это было надежным с несколькими потоками, вам необходимо защитить глобальный счетчик глобальным мьютексом (регион с комментариями "Критическая область" выше).
MONOTONIC
не гарантирует получение разных значений для каждого звонка. Это зависит от фактического временного разрешения.