time (time_t * timer) дает неверные результаты без смещения времени в системе - PullRequest
0 голосов
/ 06 февраля 2019

код ниже для выполнения некоторых вещей и сна до следующего интервала.для расчета времени ожидания я использую приведенную ниже логику.

time_t start = time(0);
time_t end = time(0);
int timeLeft = 0;
int interval = 300;
while(1)
{

    /* do something
     * lets say takes 5 to 20 seconds to execute
     */
    end = time(0);
    timeLeft = interval -(end - start);
    printf("timeLeft: %d, interval: %d, end: %u, start: %u",timeLeft,interval,end,start);
    sleep(timeLeft)
    start = time(0);
}

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

для экземпляра, когда возникла проблема,

timeLeft: 11484, интервал: 300, конец: 1549402241, начало: 1549413425

Не знаете, как это может произойти выше?нужна помощь.

1 Ответ

0 голосов
/ 08 февраля 2019

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

После просмотра вашего кода, кажется, что проблема в том, что конец <начало </strong>.Но end = time (0) всегда вызывается после start = time (0) .

В вашем примере предполагается, что вы можете вычесть time_t значения и получить прошедшие секунды между ними, но стандарт C не гарантирует этого.Кажется, ваш код работает в последней версии Linux, поэтому я взглянул на руководство по GNU Libc , и, по-видимому, time возвращает количество секунд с 00:00:00 по1 января 1970 года, а time_t это длинный int.Я также проверил значения start и end , когда возникла проблема, и их значения составляют около 49 лет с секунд, и с тех пор, как с 1 января 1970 года прошло 49 лет,похоже, что в вашем примере предположение верно.

Мое лучшее предположение состоит в том, что есть существенная разница между реальным кодом и вашим примером.Возможно, вызов start = time (0) , который происходит после вызова end = time (0) , или, возможно, ситуации, когда вызов end = time (0) делаетне происходит.

Вы можете исключить это, преобразовав свой пример в реальную программу и посмотреть, есть ли у этой программы такая же проблема.Если это так, вы можете опубликовать код для программы.Этот сайт призывает людей создавать Минимальные, полные и проверяемые примеры .

Тем временем я могу сделать еще несколько предположений:

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