2015-08-10 3 views
0

Я использовал функцию localtime дважды, поставив в том же аргументе. Однако я могу получить разные результаты. У последней может быть еще одна секунда. Код ниже.Аномальное поведение функции «localtime» в C

ptCurrentTime = localtime(&(t_TriggerTime)); 
ptCurrentTime = localtime(&(t_TriggerTime)); 

Я распечатал результаты. Первый может быть как 2015-11-07 22:19:56.123, а второй может быть как 2015-11-07 22:19:57.123. Это нормально?

+3

Укажите, пожалуйста, код, который напечатал время. – chux

+2

Стандартные версии 'localtime()' не имеют понятия о долях секунды. Нет, это не так, чтобы увидеть то же значение, что и два разных значения. Однако нам нужно будет увидеть больше кода, чтобы угадать, что происходит. –

ответ

4

Нет, это не нормально для такого рода изменений. Вы должны получать только другое значение, если:

  • t_TriggerTime изменения; или
  • , если ваш часовой пояс изменяется (и часовые пояса редко меняются на секунду, они, как правило, предпочитают почасовые или полчасовые прыжки); или
  • есть серьезная ошибка в вашей функции localtime(); или
  • вы используете несколько потоков, и общее состояние изменяется.

Этот последний пункт несет в себе. Если какой-либо другой поток выполнения также вызывает функции времени, localtime() часто возвращает адрес внутреннего объекта, который может быть изменен без вашего ведома.

Если выясняется, что это проблема, многопоточные системы могут предоставлять поточно-безопасный вариант, который использует объект, который предоставляет, а не общий внутренний. Например,

struct tm tms; 
struct tm *ptms = localtime_r (&t_TriggerTime, &tms); 
// ptms is now &tms, so use ptms->X (or tms.X). 

Однако я бы изучение кода печати очень тщательно, стандарт struct tm не имеет ни малейшего понятия о суб-второй резолюции, так что я понятия не имею, где ваш .123 откуда.

+0

Hi Paxdiablo, Вы правы. Структура не имеет понятия суб-второй резолюции. Это добавлено мной. Спасибо за ваш ответ. –

+0

Моя программа многопоточная. Итак ... вы имеете в виду, что проблема может возникнуть в ситуации, когда другой поток вызывает локальное время в одно и то же время, когда я его вызываю во второй раз? –

+1

@Ryan, да, я бы посмотрел на 'localtime_r()' как вариант. Я обновлю ответ. – paxdiablo

Смежные вопросы