CLOCK_MONOTONIC Макс. Значение - PullRequest
       6

CLOCK_MONOTONIC Макс. Значение

4 голосов
/ 21 февраля 2011

Когда clock_gettime () вернет меньшее значение, используя CLOCK_MONOTONIC, из-за достижения максимального значения? Я не имею в виду небольшие перекосы, которые были описаны как ошибки, но что-то вроде сброса счетчика.

Это измеренное время или оно связано с абсолютным числом тиков?

Мне нужно реализовать таймер (с интервалом в 1 или 2 секунды), и мне не нужна такая большая точность. Но приложение может работать несколько часов без перезапуска. (я оцениваю максимум 1 день).

Я не хочу быть уверенным, что не буду делать никаких ошибок, которые могут привести к тому, что он перестанет общаться.

Таймерfd уже решает эту проблему?

Ответы [ 2 ]

5 голосов
/ 21 февраля 2011

Поскольку struct timespec использует значение time_t для секунд, полный диапазон, который может быть покрыт, составляет не менее 68 лет. Учитывая определение CLOCK_MONOTONIC как начинающееся в некоторой произвольной точке, теоретически clock_gettime может переполниться в любое время. На практике вам нужно беспокоиться об этом, только если ваше приложение работает в течение нескольких десятилетий. Но, если вы параноик, сделайте функцию-обертку, которая громко жалуется и убивает приложение, если произойдет обход таймера.

2 голосов
/ 21 февраля 2011

CLOCK_MONOTONIC, как следует из «монотонного» имени, никогда не уходит в прошлое, оно всегда растет. Не изменится, если пользователь или другой процесс (например, NTP) изменят «настенные» часы на машине. CLOCK_MONOTONIC - правильная шкала времени для использования в таймерах. Это может в конечном итоге перевернуться, но даже с этим можно обращаться аккуратно, если вы делаете это осторожно. Используйте переменную того же типа для внутреннего таймера.

Например, следующий код будет работать накануне, если часы будут вращаться. Примечание: kDelayInterval должен быть меньше, чем период обтекания (обычно это не проблема).

struct timespec current_time;
struct timespec last_update = {0,0};
  .
  .
  clock_gettime(CLOCK_MONOTONIC, &current_time);
  if((current_time.tv_sec - last_update.tv_sec) > kDelayInterval)
  {
    .
    .
    .
    clock_gettime(CLOCK_MONOTONIC, &last_update);
  }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...