Форум программистов, компьютерный форум, киберфорум
C++
Войти
Регистрация
Восстановить пароль
 
 
Рейтинг 4.93/72: Рейтинг темы: голосов - 72, средняя оценка - 4.93
быдлокодер
1718 / 905 / 106
Регистрация: 04.06.2008
Сообщений: 5,613
1

Как получить TID текущего потока? (библиотека pthread, компилятор g++ 4.6.1 открытый вопрос niXmanу)

27.12.2011, 10:51. Просмотров 13532. Ответов 77
Метки нет (Все метки)

Да, как?
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#include <windows.h>
#include <pthread.h>
#include <stdio.h>
#include <stdlib.h>
 
void *BusyWork(void *t) {
   printf("TID= %x\n", pthread_self());
   printf("TID= %x\n", (unsigned int)GetCurrentThreadId ());
   return NULL;
}
 
int main () {
 pthread_t thread;
 pthread_create(&thread, NULL, BusyWork, NULL); 
 getchar ();
}
ВЫвод:
C++
1
2
TID= 1
TID= df0
Компилятор g++, версия 4.6.1, сборка niXmana, pthread_t определён как:
C++
1
2
typedef unsigned int uintptr_t;
typedef uintptr_t pthread_t;
//////////////////////////////////////////////////////////////////////////////////////////////////

Меж тем других версия g++, в частности, 4.5.0, pthread_t был определён так:

C++
1
2
3
4
5
6
typedef struct {
    void * p;                   /* Pointer to actual object */
    unsigned int x;             /* Extra information - reuse count etc */
} ptw32_handle_t;
 
typedef ptw32_handle_t pthread_t;

ПОлучение TID потока, сводилось таким обраом, к:
C++
1
2
3
   pthread_t pthread_t_ = pthread_self();
unsigned int TID= *(unsigned int*)(pthread_t_.p);
   printf("TID= %x\n", (unsigned int)TID);
И всё было круто. Может мне кто-нибудь ответить, как используя pthread_self() компилятора 4.6.1 получить TID потока?

Добавлено через 17 часов 32 минуты
niXman, я сделал так, открыл \i686-pc-mingw32\include, заккоментил
C++
1
//pthread_t WINPTHREAD_API pthread_self(void);
написал:
C++
1
2
#include <windows.h>
#define pthread_self (pthread_t)GetCurrentThreadId
Код:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#include <pthread.h>
#include <stdio.h>
#include <stdlib.h>
 
void *BusyWork(void *t) {
   pthread_t pthread_t_= pthread_self();
   printf("TID= %x\n", pthread_t_);
   printf("TID= %x\n", pthread_self());
   printf("TID= %x\n", (unsigned int)GetCurrentThreadId ());
   return NULL;
}
 
int main () {
 pthread_t thread;
 pthread_create(&thread, NULL, BusyWork, NULL); 
 getchar ();
}

ВЫвод:
Bash
1
2
3
TID= be0
TID= be0
TID= be0
Но хотелось бы всё-таки услышать мнение знающих людей, а то какие ещё сюрпризы меня поджидают?
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
27.12.2011, 10:51
Ответы с готовыми решениями:

Как узнать, что поток закончился (библиотека pthread)?
Друзья! Есть ли какая-нибудь pthread-функция, которая вызывается в основном потоке X и показывает-...

Компилятор не видит библиотеку pthread
При реализации многопоточности столкнулся с проблемой :компилятор не видит библиотеку...

Приоритет потока (pthread)
Доброго времени суток! Есть такой код:#include &lt;pthread.h&gt; #include &lt;iostream&gt; #include...

библиотека pthread.h в Code::Blocks
не могу найти как подключить библиотеку pthread.h в Code::Blocks. Помогите,пожалуйста, кто знает.

77
Эксперт С++
5017 / 2596 / 241
Регистрация: 07.10.2009
Сообщений: 4,311
Записей в блоге: 1
27.12.2011, 11:15 2
Вот и нашлись люди, которые расковыривают реализации, не смотря на интерфейсы.
Один вопрос. Какова конечная цель?
0
быдлокодер
1718 / 905 / 106
Регистрация: 04.06.2008
Сообщений: 5,613
27.12.2011, 11:29  [ТС] 3

Не по теме:

Я все вопросы освещу сполна! Дам любопытству удовлетворенье!


э... Цель чего?
Ну на всякий случай. Есть функция pthread_self();
Хотелось бы с помощью её получить TID потока, для чего, она, собственно и служит. Всё! Вся цель.

Корячится ещё один глобальный вопрос- а вообще это чего? Недостаток, ошибка, системная ошибка или разработчики не любят posix?

Не по теме:

Так-то есть пункт, как не задавать вопросы:
Вопрос:

Как можно с помощью X сделать Y?
Ответ:

Если вы хотите сделать Y, надо так и спрашивать, не предполагая заранее использование метода, который может вовсе не подходить. Вопросы такого вида часто задают те, кто не просто ничего не знает об X, но сбит с толку решаемой проблемой Y и слишком сконцентрирован на деталях своей конкретной ситуации. Обычно лучше игнорировать таких людей, пока они не сформулируют свою проблему лучше.




Но думаю у тех, кто меня знает, язык не повернётся упрекать, чего это я привязался к pthread_self(), если есть GetCurrentThreadid, ибо подобные рекомендации нужны для школоты.
0
Эксперт С++
5017 / 2596 / 241
Регистрация: 07.10.2009
Сообщений: 4,311
Записей в блоге: 1
27.12.2011, 11:34 4
kravam, все дело в том, что функция pthread_self должна возвращать pthread_t, что она и делает. А как должен быть представлен тип pthread_t остается на совести разработчиков. И я не вижу смысла его расковыривать.
0
быдлокодер
1718 / 905 / 106
Регистрация: 04.06.2008
Сообщений: 5,613
27.12.2011, 11:47  [ТС] 5
Ну если иметь ввиду, что этот mingw достался мне бесплатно и поэтому грех пенять на то, что некоторые функции работают не так, как в стандарте posix, (а напомню, что команда g++-v даёт, в частности "Thread model: posix"), типа "обработай мелким напильником сам" (что я и сделал), то придётся удовлетвориться этим объяснением. Но что-то мне подсказывает, что парни-разработчики ответственно подходят к работе и скоро придёт niXman и скажет: TID с помощью pthread_self надо получать так-то и так-то.

...А тип возвращаемого значения меня интересует постольку поскольку. Мне нужен коректный TID. Всё! Написано в стандарте:
"DESCRIPTION
The pthread_self() function returns the thread ID of the calling thread."

Вот пусть оно так и будет.
0
Эксперт С++
5017 / 2596 / 241
Регистрация: 07.10.2009
Сообщений: 4,311
Записей в блоге: 1
27.12.2011, 12:32 6
Цитата Сообщение от kravam Посмотреть сообщение
А тип возвращаемого значения меня интересует постольку поскольку. Мне нужен коректный TID. Всё! Написано в стандарте:
"DESCRIPTION
The pthread_self() function returns the thread ID of the calling thread."
Ок, спрошу еще раз: чем pthread_t не ID?
0
быдлокодер
1718 / 905 / 106
Регистрация: 04.06.2008
Сообщений: 5,613
27.12.2011, 13:21  [ТС] 7
Странно, очень-очень странно всё это.
++++++++++++++++++++++++++++++++++++++++++++++++++
pthread_t может быть TID, но не в версии компилятора 4.6.1
...Запускаем программу два раза и видим, что в системе два потока с идентификаторами 1. Это что, TID? А если мне понадобится искать хэндл одного из этих потоков, как мне его идентифицировать? единицей?

Не по теме:

Вот он тебя и привезёт на петровку 38... "Место встречи изменить нельзя"


Жду вопроса, зачем мне может понадобиться хэндл потока

Добавлено через 2 минуты
Этот код надо запустить два раза:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#include <windows.h>
#include <pthread.h>
#include <stdio.h>
#include <stdlib.h>
 
void *BusyWork(void *t) {
   printf("TID= %x\n", pthread_self());
   printf("TID= %x\n", (unsigned int)GetCurrentThreadId ());
   return NULL;
}
 
int main () {
 pthread_t thread;
 pthread_create(&thread, NULL, BusyWork, NULL); 
 getchar ();
}
0
Эксперт С++
5017 / 2596 / 241
Регистрация: 07.10.2009
Сообщений: 4,311
Записей в блоге: 1
27.12.2011, 14:40 8
Я Вам все пытаюсь сказать, что нельзя вот так просто распечать со спецификатором "%x" значение pthread_t. Это может работать, а может и не работать. В Вашем случае если и работает, то подход такой все равно не верен.
IEEE Std 1003.1-2001/Cor 2-2004, item XBD/TC2/D6/26 is applied, adding pthread_t to the list of types that are not required to be arithmetic types, thus allowing pthread_t to be defined as a structure.
Цитата Сообщение от kravam Посмотреть сообщение
Этот код надо запустить два раза:
С радостью бы, но винды не имею.
0
быдлокодер
1718 / 905 / 106
Регистрация: 04.06.2008
Сообщений: 5,613
27.12.2011, 15:11  [ТС] 9
В Вашем случае если и работает, то подход такой все равно не верен.
В моём случае ничё не работает и менно поэтому я тупо был вынужден заменить в макросах pthread_self() на GetCurrentThreadid.

Я Вам все пытаюсь сказать, что нельзя вот так просто распечать со спецификатором "%x" значение pthread_t.
ОК, я хотел бы увидеть ЛЮБОЙ способ получения TID, одно ограничение: с помощью pthread_self(), естественно.
Пусть это будет самый сложный способ, но пусть он будет! Кстати, если Вы читали тему внимательно, то увидели, что в другой версии pthread тип pthread_t довольно специфичен, но я с ним справился и научился-таки получать вожделенный TID:
C++
1
2
3
   pthread_t pthread_t_ = pthread_self();
unsigned int TID= *(unsigned int*)(pthread_t_.p);
   printf("TID= %x\n", (unsigned int)TID);
Так что ничего страшного, если значение, вернутое pthread_self() будет означать, например, индекс в массиве каких-нибудь TIDов, я это переживу. Я найду таблицу и найду там по индексу TID. Пока же я читаю у вас, что можно получить TID который совпал бы с вернутым GetCurrentThredid. А как можно? А это второй вопрос. главное, что можно. Можно и всё тут. Вот можно. Надо как-то извернуться. А как извернуться? Ну... вот.

С радостью бы, но винды не имею.
а, ну вот. Вот возьмите где-нибудь винду, запустите и убедитесь, что я прав.

Добавлено через 8 минут
И кстати, pthread_t имеет в осудаемой версии тип unsigned int
C++
1
2
typedef unsigned int uintptr_t;
typedef uintptr_t pthread_t;
Я ведь писал уже об этом. Всё, это тупик. Это не структура. Чё дальше делать я не знаю.
0
В астрале
Эксперт С++
8023 / 4780 / 654
Регистрация: 24.06.2010
Сообщений: 10,558
27.12.2011, 15:24 10
В gcc4.6.1 под линь все ажурно.

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
#include <pthread.h>
#include <iostream>
 
void* thread_(void* arg)
{
   std::cout << pthread_self() << std::endl;
}
 
int main()
{
   pthread_t thread;
   pthread_create(&thread, 0, thread_, 0);
   pthread_join(thread, 0);
}
Bash
1
2
3
4
5
6
7
8
9
10
forever@pterois:~/My_pro1/cpp_pro$ ./file 
3075668848
forever@pterois:~/My_pro1/cpp_pro$ ./file 
3076037488
forever@pterois:~/My_pro1/cpp_pro$ ./file 
3075951472
forever@pterois:~/My_pro1/cpp_pro$ ./file 
3074419568
forever@pterois:~/My_pro1/cpp_pro$ ./file 
3074923376
0
быдлокодер
1718 / 905 / 106
Регистрация: 04.06.2008
Сообщений: 5,613
27.12.2011, 19:43  [ТС] 11
Не ну под линь это под линь... Ждём niXmana.

Добавлено через 4 часа 8 минут
Изменение pthread ничего не даёт, при подключении iostream компилятор выдаёт простыню ошибок.
0
Эксперт С++
3210 / 1459 / 73
Регистрация: 09.08.2009
Сообщений: 3,441
Записей в блоге: 2
27.12.2011, 21:33 12
многа букаф.
на вопрос "Как получить TID текущего потока?"
ответ - pthread_self()

Добавлено через 2 минуты
Цитата Сообщение от kravam Посмотреть сообщение
Меж тем других версия g++, в частности, 4.5.0, pthread_t был определён так:
typedef struct {
* * void * p; * * * * * * * * * /* Pointer to actual object */
* * unsigned int x; * * * * * * /* Extra information - reuse count etc */
} ptw32_handle_t;
typedef ptw32_handle_t pthread_t;
это не правильно. в стандарте pthread говорится о том, что pthread_t должен быть интегральным типом. но никак не структурой.

Добавлено через 2 минуты
Цитата Сообщение от kravam Посмотреть сообщение
Может мне кто-нибудь ответить, как используя pthread_self() компилятора 4.6.1 получить TID потока?
какого вида тебе нужен идентификатор? чтоб больше нулей, или все же больше единиц? в хексе, или десятичный?

Добавлено через 9 минут
Цитата Сообщение от fasked Посмотреть сообщение
thus allowing pthread_t to be defined as a structure.
хм.. а этого я не знал..

Добавлено через 2 минуты
kravam, ты таки хочешь из pthread_t получить вендовый хендл потока?
0
быдлокодер
1718 / 905 / 106
Регистрация: 04.06.2008
Сообщений: 5,613
27.12.2011, 21:39  [ТС] 13
Я хочу получить TID, используя pthread_self(), у меня самого не получается это сделать. Будь добр, напиши как это сделать. А к нужному виду я его сам приведу, будь спок. Могёшь? У меня windows если что.
0
Эксперт С++
3210 / 1459 / 73
Регистрация: 09.08.2009
Сообщений: 3,441
Записей в блоге: 2
27.12.2011, 21:52 14
kravam, постом выше мой вопрос. ибо я не понял что именно тебе нужно.

Добавлено через 5 минут
kravam, так же прошу заметить, что pthreads это кроссплатформенный стандарт, который по интерфейсам абстрагирован от используемой платформы. по этому, вопрос прежний - что конкретно тебе нужно чтоб возвращала pthread_self() ?
0
быдлокодер
1718 / 905 / 106
Регистрация: 04.06.2008
Сообщений: 5,613
27.12.2011, 21:55  [ТС] 15
TID потока. Thread ID. Вот это действие выполнить надо:
C++
1
2
[B]DESCRIPTION[/B]
[INDENT] The [I]pthread_self()[/I] function returns the thread ID of the calling thread. [/INDENT]
Если ты имеешь ввиду, что мне надо, чтобы было больше нолей или единиц, то мне всё равно, но пусть TID будет правильным. То есть пусть он совпадает со значением, который вернёт GetCurrentThreadid. Можешь?

Добавлено через 2 минуты
И я не упореблял слово "возвращала", заметь. Я говорю "с помощью pthread_self", раньше у меня так получалось.
0
Эксперт С++
3210 / 1459 / 73
Регистрация: 09.08.2009
Сообщений: 3,441
Записей в блоге: 2
27.12.2011, 21:59 16
Цитата Сообщение от kravam Посмотреть сообщение
пусть TID будет правильным
он правильный.
или: "что в твоем понимании правильный TID" ?

Цитата Сообщение от kravam Посмотреть сообщение
То есть пусть он совпадает со значением, который вернёт GetCurrentThreadid.
но так быть не должно. ибо это не правильно и теряется абстрагированость от платформы.

Добавлено через 1 минуту
Цитата Сообщение от kravam Посмотреть сообщение
Можешь?
да. но это не просто. по этому и хочется понять суть, дабы оценить смысл времязатрат.
0
быдлокодер
1718 / 905 / 106
Регистрация: 04.06.2008
Сообщений: 5,613
27.12.2011, 22:08  [ТС] 17
Ну хорошо. Значит, я думал что правильный TID это тот, который совпадает со значением, вернутым GetCurrentThreadid., но я ошибся. Хорошо. А ты можешь с помощью pthread_self получить TID? (Я не употребляю слово "правильный" заметь но не потому, что хочу получить неправильный. а потому, что чем меньше названий, тем меньше разногласий.)
Итак, как с помощью pthread_self получить TID потока?
0
Эксперт С++
3210 / 1459 / 73
Регистрация: 09.08.2009
Сообщений: 3,441
Записей в блоге: 2
27.12.2011, 22:38 18
если мыслить абстрагированно от платформы, то pthread_self() должна возвращать идентификатор потока, в котором была вызвана. что она и делает.
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#include <pthread.h>
#include <stdio.h>
 
void* dowork(void* arg){
   (void)arg;
   printf("ID = %x\n", pthread_self());
}
 
int main(int argc, char *argv[]){
   pthread_t th1, th2;
   
   pthread_create(&th1, 0, &dowork, 0);
   pthread_create(&th2, 0, &dowork, 0);
   
   pthread_join(th1, 0);
   pthread_join(th2, 0);
}
ID = 1
ID = 2
Добавлено через 25 минут
ТС`а и след пропал. тему можно щитать закрытой.
0
Эксперт С++
5017 / 2596 / 241
Регистрация: 07.10.2009
Сообщений: 4,311
Записей в блоге: 1
27.12.2011, 22:48 19
Цитата Сообщение от niXman Посмотреть сообщение
ТС`а и след пропал. тему можно щитать закрытой.
ТС и сам не знает, чего хочет, видимо.
0
быдлокодер
1718 / 905 / 106
Регистрация: 04.06.2008
Сообщений: 5,613
27.12.2011, 22:52  [ТС] 20
Да ну конечно, я в туалет ходил.

+++++++++++++++++++++++++++++++++++++++++++++++++

Ну я щас немножко занят, но я подобные коды приводил до этого, а именно в сообщении номер 7. Короче, сдаётся мне, pthread_self в представленном варианте работает неправильно, проще говороя не выполняет поставленной задачи и уж вовсе не потому, что её значение не совпадает с GetCurrentThreadid, хотя мне с моим невежеством хватило бы и этого, а потому, что если запустить этот код два раза, то в системе окажется два потока с одинаковыми уникальными идентификаторами.

Так какие же они уникальные спрашивается? Я пока наблюдаю, что полученные ID уникальны в пределах процесса, но не в пределах оси.

+++++++++++++++++++++++++++++++++++++++++++++++++

Ну на первый вопрос я получил ответ но возник второй вопрос- зачем нужны такие идентификаторы? Странно, очень странно. Хэндл я с их помощью не получу. Поток однозначно не идентифицирую (последнее было бы возможно, если бы в твою программу добавить getchar() и запустить её два раза и получить 1, 2, 3 и 4 и хотя толку от них было бы мало, но всё вперёд). В общем не могу не сравнить с версией библиотеки pthread, которая у меня была до этого. Там я получал уникальные (не мнимые уникальные, а уникальные уникальные) идентификаторы В ПРЕДЕЛАХ СИСТЕМЫ, от которых была польза, я мог получить, например хэндл потока с их помощью.
Всё это говорено c единственной целью- улучшить g++, а не с целью кого-то обидеть.
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
27.12.2011, 22:52

Заказываю контрольные, курсовые, дипломные и любые другие студенческие работы здесь.

Pthread функция потока внутри класса
Нужно чтобы функция pthread_create принимала на входе функцию-член класса, в котором я вызываю...

Изолирование данных родительского потока от дочернего в pthread
Сабж. Как сделать так, что бы в дочернем потоке не были видны данные родительского потока? Для...

Параллельное программирование, библиотека pthread. Объединение, пересечение, разность множеств A, B, C
Приветствую всех! Возникла проблема, ума не приложу как ниже указанную задачу реализовать через...

Как получить ответ на открытый порт UDP
Доброго времени суток! Делаю небольшую программку которая отправляет широковещательный запрос на...

как получить дескриптор файла, открытый функцией fopen
как получить дескриптор файла, открытый функцией fopen

Как можно программно открыть ссылку и получить в окне броузера открытый файл?
Добрый день! Как можно программно открыть ссылку и получить в окне броузера открытый файл? ...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2020, vBulletin Solutions, Inc.