time & pthread
От: Grammazeka  
Дата: 26.05.05 07:02
Оценка:
Приветствую!

Столкнулся с проблемой, которая проявляется на линуксе и, даже, в 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
*/

pthread_attr_init(&attr);
pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_JOINABLE);

for (i = 0; i < NUMTHREADS; i++)
{
assert(pthread_create(&t, &attr, func, (void*)i) == 0);
pthread_join(t, &result);
}

return 0;
}

Regards,
Kirill.
Posted via RSDN NNTP Server 1.9
Re: time & pthread
От: Belial Беларусь  
Дата: 26.05.05 09:08
Оценка:
Здравствуйте, 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[2]: time & pthread
От: Grammazeka  
Дата: 26.05.05 12:06
Оценка:
Сделал тоже самое (т.е. избавился от 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>
>
Posted via RSDN NNTP Server 1.9
Re[2]: time & pthread
От: Grammazeka  
Дата: 26.05.05 12:07
Оценка:
Сделал тоже самое (т.е. избавился от 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>
>
Posted via RSDN NNTP Server 1.9
Re[2]: time & pthread
От: Grammazeka  
Дата: 26.05.05 12:07
Оценка:
Сделал тоже самое (т.е. избавился от 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>
>
Posted via RSDN NNTP Server 1.9
Re: time & pthread
От: ilejn Россия  
Дата: 26.05.05 12:52
Оценка:
Здравствуйте, Grammazeka, Вы писали:

>Не могу найти логического объяснения происходящему.


Это означает, что ctime_r не устанавливает сама tzname в
надежде, что это кто-то сделает за нее. Если такое поведение
явно не специфицировано в man, то я бы счел это багом.
Re: time & pthread
От: Michael Chelnokov Украина  
Дата: 26.05.05 20:56
Оценка:
Здравствуйте, Grammazeka, Вы писали:

G>Однако стоит раскомментировать одну из двух строчек в ф-ции main

G>(любою), или обе, как все начинает работать как надо.

Исходники не пробовали смотреть? ctime случайно не вызывает tzset сама? Если вызывает, то все объясняется.
ctime_r, очевидно, не вызывает tzset.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.