Столкнулся с проблемой, которая проявляется на линуксе и, даже, в cygwin-е.
Вот пример программки, в которой время выводится неправильно (в UTC
вместо local) во всех трех нитях.
Однако стоит раскомментировать одну из двух строчек в ф-ции main
(любою), или обе, как все начинает работать как надо.
Не могу найти логического объяснения происходящему.
Вот сам пример:
enum {
NUMTHREADS = 3
};
void * func(void * arg)
{
int id;
time_t t = 0;
char b[64], *d;
id = (int)(arg);
memset(b,'\0',64);
t = time(&t);
d = ctime_r(&t,b);
d[strlen(d)-1]='\0';
printf("thread id %d, time %s, buf %s\n", id, d, b);
return (void *) 0;
}
int
main()
{
pthread_t t;
pthread_attr_t attr;
void * result = NULL;
int i;
time_t tt;
tt=0;
tt=time(&tt);
/*
uncomment one or two next lines to see correct
time within threads
*/
/* tzset(); */
/* printf("time = %s\n", ctime(&tt)); */
/*
it's strange but this is enougth to uncomment only _one_ line,
tzset or ctime and everuthing begins work correctly
*/
Здравствуйте, Grammazeka, Вы писали:
G>Приветствую!
G>Столкнулся с проблемой, которая проявляется на линуксе и, даже, в cygwin-е.
G>Вот пример программки, в которой время выводится неправильно (в UTC G>вместо local) во всех трех нитях.
G>Однако стоит раскомментировать одну из двух строчек в ф-ции main G>(любою), или обе, как все начинает работать как надо.
G>Не могу найти логического объяснения происходящему.
immortal% ./time
thread id 0, time Thu May 26 12:04:18 2005, buf Thu May 26 12:04:18 2005
thread id 1, time Thu May 26 12:04:18 2005, buf Thu May 26 12:04:18 2005
thread id 2, time Thu May 26 12:04:18 2005, buf Thu May 26 12:04:18 2005
immortal% date
Чтв Май 26 12:04:33 EEST 2005
immortal% date -u
Чтв Май 26 09:07:07 UTC 2005
Сделал тоже самое (т.е. избавился от assert-а и поставил include-ы
непосредственно в С-шник). Эффект тот же.
$ ./time
thread id 0, time Thu May 26 12:03:58 2005, buf Thu May 26 12:03:58 2005
thread id 1, time Thu May 26 12:03:58 2005, buf Thu May 26 12:03:58 2005
thread id 2, time Thu May 26 12:03:58 2005, buf Thu May 26 12:03:58 2005
kratkin@kama ~/time_thread
$ date -u
Thu May 26 12:04:08 UTC 2005
kratkin@kama ~/time_thread
$ date
Thu May 26 16:04:10 RDT 2005
Все не так просто видимо.
Regards,
Kirill.
Belial wrote: > > From: *Belial* </Users/Profile.aspx?uid=40739> </search/?group=22> > </Users/Private/AddFav.aspx?mid=1191398> <NewMsg.aspx?gid=22> > <NewMsg.aspx?mid=1191398> <?mid=1191398> > <Message.aspx?mid=1191398#1191398> <NewMsg.aspx?mid=1191398&edit=1> > <Private/Self.aspx?mid=1191398> > > Здравствуйте, Grammazeka, Вы писали: > > G>Приветствую! > > G>Столкнулся с проблемой, которая проявляется на линуксе и, даже, в > cygwin-е. > > G>Вот пример программки, в которой время выводится неправильно (в UTC > G>вместо local) во всех трех нитях. > > G>Однако стоит раскомментировать одну из двух строчек в ф-ции main > G>(любою), или обе, как все начинает работать как надо. > > G>Не могу найти логического объяснения происходящему. > > [кусь] > > Добавил > #include <stdio.h> > #include <time.h> > #include <pthread.h> > > убрал assert. > > immortal% ./time > thread id 0, time Thu May 26 12:04:18 2005, buf Thu May 26 12:04:18 2005 > thread id 1, time Thu May 26 12:04:18 2005, buf Thu May 26 12:04:18 2005 > thread id 2, time Thu May 26 12:04:18 2005, buf Thu May 26 12:04:18 2005 > immortal% date > Чтв Май 26 12:04:33 EEST 2005 > immortal% date -u > Чтв Май 26 09:07:07 UTC 2005 > Re: time & pthread <?mid=1191398> Оценить <RateList.aspx?mid=1191398> > <Private/Rate.aspx?mid=1191398&rate=-3> > <Private/Rate.aspx?mid=1191398&rate=1> > <Private/Rate.aspx?mid=1191398&rate=2> > <Private/Rate.aspx?mid=1191398&rate=3> > <Private/Rate.aspx?mid=1191398&rate=-1> > <Private/Rate.aspx?mid=1191398&rate=-2> > <Private/Rate.aspx?mid=1191398&rate=-4> > <Private/Rate.aspx?mid=1191398&rate=0> >
Сделал тоже самое (т.е. избавился от assert-а и поставил include-ы
непосредственно в С-шник). Эффект тот же.
$ ./time
thread id 0, time Thu May 26 12:03:58 2005, buf Thu May 26 12:03:58 2005
thread id 1, time Thu May 26 12:03:58 2005, buf Thu May 26 12:03:58 2005
thread id 2, time Thu May 26 12:03:58 2005, buf Thu May 26 12:03:58 2005
kratkin@kama ~/time_thread
$ date -u
Thu May 26 12:04:08 UTC 2005
kratkin@kama ~/time_thread
$ date
Thu May 26 16:04:10 RDT 2005
Все не так просто видимо.
Regards,
Kirill.
Belial wrote: > > From: *Belial* </Users/Profile.aspx?uid=40739> </search/?group=22> > </Users/Private/AddFav.aspx?mid=1191398> <NewMsg.aspx?gid=22> > <NewMsg.aspx?mid=1191398> <?mid=1191398> > <Message.aspx?mid=1191398#1191398> <NewMsg.aspx?mid=1191398&edit=1> > <Private/Self.aspx?mid=1191398> > > Здравствуйте, Grammazeka, Вы писали: > > G>Приветствую! > > G>Столкнулся с проблемой, которая проявляется на линуксе и, даже, в > cygwin-е. > > G>Вот пример программки, в которой время выводится неправильно (в UTC > G>вместо local) во всех трех нитях. > > G>Однако стоит раскомментировать одну из двух строчек в ф-ции main > G>(любою), или обе, как все начинает работать как надо. > > G>Не могу найти логического объяснения происходящему. > > [кусь] > > Добавил > #include <stdio.h> > #include <time.h> > #include <pthread.h> > > убрал assert. > > immortal% ./time > thread id 0, time Thu May 26 12:04:18 2005, buf Thu May 26 12:04:18 2005 > thread id 1, time Thu May 26 12:04:18 2005, buf Thu May 26 12:04:18 2005 > thread id 2, time Thu May 26 12:04:18 2005, buf Thu May 26 12:04:18 2005 > immortal% date > Чтв Май 26 12:04:33 EEST 2005 > immortal% date -u > Чтв Май 26 09:07:07 UTC 2005 > Re: time & pthread <?mid=1191398> Оценить <RateList.aspx?mid=1191398> > <Private/Rate.aspx?mid=1191398&rate=-3> > <Private/Rate.aspx?mid=1191398&rate=1> > <Private/Rate.aspx?mid=1191398&rate=2> > <Private/Rate.aspx?mid=1191398&rate=3> > <Private/Rate.aspx?mid=1191398&rate=-1> > <Private/Rate.aspx?mid=1191398&rate=-2> > <Private/Rate.aspx?mid=1191398&rate=-4> > <Private/Rate.aspx?mid=1191398&rate=0> >
Сделал тоже самое (т.е. избавился от assert-а и поставил include-ы
непосредственно в С-шник). Эффект тот же.
$ ./time
thread id 0, time Thu May 26 12:03:58 2005, buf Thu May 26 12:03:58 2005
thread id 1, time Thu May 26 12:03:58 2005, buf Thu May 26 12:03:58 2005
thread id 2, time Thu May 26 12:03:58 2005, buf Thu May 26 12:03:58 2005
kratkin@kama ~/time_thread
$ date -u
Thu May 26 12:04:08 UTC 2005
kratkin@kama ~/time_thread
$ date
Thu May 26 16:04:10 RDT 2005
Все не так просто видимо.
Regards,
Kirill.
Belial wrote: > > From: *Belial* </Users/Profile.aspx?uid=40739> </search/?group=22> > </Users/Private/AddFav.aspx?mid=1191398> <NewMsg.aspx?gid=22> > <NewMsg.aspx?mid=1191398> <?mid=1191398> > <Message.aspx?mid=1191398#1191398> <NewMsg.aspx?mid=1191398&edit=1> > <Private/Self.aspx?mid=1191398> > > Здравствуйте, Grammazeka, Вы писали: > > G>Приветствую! > > G>Столкнулся с проблемой, которая проявляется на линуксе и, даже, в > cygwin-е. > > G>Вот пример программки, в которой время выводится неправильно (в UTC > G>вместо local) во всех трех нитях. > > G>Однако стоит раскомментировать одну из двух строчек в ф-ции main > G>(любою), или обе, как все начинает работать как надо. > > G>Не могу найти логического объяснения происходящему. > > [кусь] > > Добавил > #include <stdio.h> > #include <time.h> > #include <pthread.h> > > убрал assert. > > immortal% ./time > thread id 0, time Thu May 26 12:04:18 2005, buf Thu May 26 12:04:18 2005 > thread id 1, time Thu May 26 12:04:18 2005, buf Thu May 26 12:04:18 2005 > thread id 2, time Thu May 26 12:04:18 2005, buf Thu May 26 12:04:18 2005 > immortal% date > Чтв Май 26 12:04:33 EEST 2005 > immortal% date -u > Чтв Май 26 09:07:07 UTC 2005 > Re: time & pthread <?mid=1191398> Оценить <RateList.aspx?mid=1191398> > <Private/Rate.aspx?mid=1191398&rate=-3> > <Private/Rate.aspx?mid=1191398&rate=1> > <Private/Rate.aspx?mid=1191398&rate=2> > <Private/Rate.aspx?mid=1191398&rate=3> > <Private/Rate.aspx?mid=1191398&rate=-1> > <Private/Rate.aspx?mid=1191398&rate=-2> > <Private/Rate.aspx?mid=1191398&rate=-4> > <Private/Rate.aspx?mid=1191398&rate=0> >
Здравствуйте, Grammazeka, Вы писали:
>Не могу найти логического объяснения происходящему.
Это означает, что ctime_r не устанавливает сама tzname в
надежде, что это кто-то сделает за нее. Если такое поведение
явно не специфицировано в man, то я бы счел это багом.
Здравствуйте, Grammazeka, Вы писали:
G>Однако стоит раскомментировать одну из двух строчек в ф-ции main G>(любою), или обе, как все начинает работать как надо.
Исходники не пробовали смотреть? ctime случайно не вызывает tzset сама? Если вызывает, то все объясняется.
ctime_r, очевидно, не вызывает tzset.