Гарантия любой функции времени для возврата различных значений для вызовов

0

Я нахожу функцию времени, которая гарантирует возврат разных значений для разных вызовов. Я попробовал метод ниже на LINUX, но обнаружил, что это не то, что я хочу, он может возвращать одинаковое значение для вызовов из разных потоков.

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

Есть ли другой способ сделать это на LINUX?

  • 0
    Первым открытием должен быть поиск, верно? И самое большее, что вы получаете, - это монотонный счетчик, который вы должны сами дополнить любой необходимой информацией, чтобы сделать ее уникальной.
  • 0
    MONOTONIC не гарантирует получение разных значений для каждого звонка. Это зависит от фактического временного разрешения.
Показать ещё 2 комментария
Теги:
multithreading

1 ответ

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;
}

Поскольку вы хотите, чтобы это было надежным с несколькими потоками, вам необходимо защитить глобальный счетчик глобальным мьютексом (регион с комментариями "Критическая область" выше).

Ещё вопросы

Сообщество Overcoder
Наверх
Меню