The OpenNET Project / Index page

[ новости /+++ | форум | теги | ]

форумы  помощь  поиск  регистрация  майллист  вход/выход  слежка  RSS
"вывод thread id"
Вариант для распечатки  
Пред. тема | След. тема 
Форумы Программирование под UNIX (Public)
Изначальное сообщение [Проследить за развитием треда]

"вывод thread id"  
Сообщение от roman (??) on 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). В чем может быть проблема?
Спасибо!

Высказать мнение | Ответить | Правка | Наверх | Cообщить модератору

 Оглавление

Сообщения по теме [Сортировка по времени | RSS]


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

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

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

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

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

Высказать мнение | Ответить | Правка | Наверх | Cообщить модератору

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

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

Ponyatno, spasibo za raz'yasneniya !

Высказать мнение | Ответить | Правка | Наверх | Cообщить модератору

5. "вывод thread id"  
Сообщение от roman (??) on 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?

Высказать мнение | Ответить | Правка | Наверх | Cообщить модератору

Архив | Удалить

Индекс форумов | Темы | Пред. тема | След. тема
Оцените тред (1=ужас, 5=супер)? [ 1 | 2 | 3 | 4 | 5 ] [Рекомендовать для помещения в FAQ]




Партнёры:
PostgresPro
Inferno Solutions
Hosting by Hoster.ru
Хостинг:

Закладки на сайте
Проследить за страницей
Created 1996-2024 by Maxim Chirkov
Добавить, Поддержать, Вебмастеру