Приветствую.Изучаю треды, вот простенькая программа, проблема в том, что ВСЕГДА тред создается с одним и тем же ID:
#include <stdio.h>
#include <unistd.h>
#include <pthread.h>void *thread_func(void *tid)
{
printf("thread %lu run ", *((pthread_t *)tid));
pthread_exit(NULL);
}int main(void)
{
pthread_t tid;while (1) {
if (pthread_create(&tid, NULL, thread_func, (void *)&tid) != 0) {
perror("pthread_create()");
return -1;
}if (pthread_join(tid, NULL) != 0) {
perror("pthread_join()");
return -1;
}printf("and terminated, sleep 3 sec.\n");
sleep(3);
}return 0;
}Вывод программы такой:
thread 1082354880 run and terminated, sleep 3 sec.
thread 1082354880 run and terminated, sleep 3 sec.
thread 1082354880 run and terminated, sleep 3 sec.
...ОС - линукс 2.6.18 (debian etch). В чем может быть проблема?
Спасибо!
А в чем собственно проблема? Предыдущий поток успевает завершиться к моменту запуска следующего, вся статусная информация (код возврата) также уже оказывается считана. Так зачем присваивать другой идентификатор потока?
>А в чем собственно проблема? Предыдущий поток успевает завершиться к моменту запуска
>следующего, вся статусная информация (код возврата) также уже оказывается считана. Так
>зачем присваивать другой идентификатор потока?Видимо это свойственно не только линуксовой реализации тредов. Я собрал этот пример в freebsd 6.2 с тремя разными либами:
1) libc_r - reentrant libc
2) libpthread - POSIX threads
3) libthr - 1:1 threadsТолько в первом случае ID одинаковые, во втором и третьем - меняются.
Строго говоря pthread_t не обязан быть интом, безнаковым интом, лонгом. Это может быть даже структура. Зависит от реализации. Вы не можете безопасно использовать printf("%lu", tid);
Возможно только использовать разрешенные операции с pthread_t - т.е. те что начинаются с префикса pthread_. Например pthread_equal(). Как назначать ID thread - внутренее дело ядра или библиотеки потоков (смотря как оно реализовано в конкретной системе). Ну и в данном конкретном случае менеджер потоков скорее всего действует согласно логике описанной DeadMustdie :)
>Строго говоря pthread_t не обязан быть интом, безнаковым интом, лонгом. Это может
>быть даже структура. Зависит от реализации. Вы не можете безопасно использовать
>printf("%lu", tid);
>Возможно только использовать разрешенные операции с pthread_t - т.е. те что начинаются
>с префикса pthread_. Например pthread_equal(). Как назначать ID thread - внутренее
>дело ядра или библиотеки потоков (смотря как оно реализовано в конкретной
>системе). Ну и в данном конкретном случае менеджер потоков скорее всего
>действует согласно логике описанной DeadMustdie :)Ponyatno, spasibo za raz'yasneniya !
>Строго говоря pthread_t не обязан быть интом, безнаковым интом, лонгом. Это может
>быть даже структура. Зависит от реализации. Вы не можете безопасно использовать
>printf("%lu", tid);
>Возможно только использовать разрешенные операции с pthread_t - т.е. те что начинаются
>с префикса pthread_. Например pthread_equal(). Как назначать ID thread - внутренее
>дело ядра или библиотеки потоков (смотря как оно реализовано в конкретной
>системе). Ну и в данном конкретном случае менеджер потоков скорее всего
>действует согласно логике описанной DeadMustdie :)Погуглив на эту тему, я пришел к выводу, что так тоже делать нельзя:
void *thread_func(void *arg)
{
printf("thread %lu ", pthread_self());
pthread_exit(NULL);
}поскольку thread id может быть чем угодно, включая структуру. И вроде как правильный способ получить id треда - это вызывать в треде pthread_key_create().
Правильно ли я понял? Не подскажите ли примерчик на тему использования этой ф-ции для печати id?