URL: https://www.opennet.me/cgi-bin/openforum/vsluhboard.cgi
Форум: vsluhforumID9
Нить номер: 6872
[ Назад ]

Исходное сообщение
"вывод thread id"

Отправлено roman , 22-Окт-07 08:57 
Приветствую.

Изучаю треды, вот простенькая программа, проблема в том, что ВСЕГДА тред создается с одним и тем же 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). В чем может быть проблема?
Спасибо!


Содержание

Сообщения в этом обсуждении
"вывод thread id"
Отправлено DeadMustdie , 22-Окт-07 09:37 
А в чем собственно проблема? Предыдущий поток успевает завершиться к моменту запуска следующего, вся статусная информация (код возврата) также уже оказывается считана. Так зачем присваивать другой идентификатор потока?

"вывод thread id"
Отправлено roman , 22-Окт-07 10:03 
>А в чем собственно проблема? Предыдущий поток успевает завершиться к моменту запуска
>следующего, вся статусная информация (код возврата) также уже оказывается считана. Так
>зачем присваивать другой идентификатор потока?

Видимо это свойственно не только линуксовой реализации тредов. Я собрал этот пример в freebsd 6.2 с тремя разными либами:

1) libc_r - reentrant libc
2) libpthread - POSIX threads
3) libthr - 1:1 threads

Только в первом случае ID одинаковые, во втором и третьем - меняются.


"вывод thread id"
Отправлено vic , 22-Окт-07 13:16 
Строго говоря pthread_t не обязан быть интом, безнаковым интом, лонгом. Это может быть даже структура. Зависит от реализации. Вы не можете безопасно использовать printf("%lu", tid);
Возможно только использовать разрешенные операции с pthread_t - т.е. те что начинаются с префикса pthread_. Например pthread_equal(). Как назначать ID thread - внутренее дело ядра или библиотеки потоков (смотря как оно реализовано в конкретной системе). Ну и в данном конкретном случае менеджер потоков скорее всего действует согласно логике описанной DeadMustdie :)

"вывод thread id"
Отправлено roman , 22-Окт-07 16:40 
>Строго говоря pthread_t не обязан быть интом, безнаковым интом, лонгом. Это может
>быть даже структура. Зависит от реализации. Вы не можете безопасно использовать
>printf("%lu", tid);
>Возможно только использовать разрешенные операции с pthread_t - т.е. те что начинаются
>с префикса pthread_. Например pthread_equal(). Как назначать ID thread - внутренее
>дело ядра или библиотеки потоков (смотря как оно реализовано в конкретной
>системе). Ну и в данном конкретном случае менеджер потоков скорее всего
>действует согласно логике описанной DeadMustdie :)

Ponyatno, spasibo za raz'yasneniya !


"вывод thread id"
Отправлено roman , 25-Окт-07 11:59 
>Строго говоря 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?