Форум программистов, компьютерный форум CyberForum.ru
Наши страницы

C++

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 66, средняя оценка - 4.89
kravam
быдлокодер
1695 / 882 / 45
Регистрация: 04.06.2008
Сообщений: 5,459
#1

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

27.12.2011, 10:51. Просмотров 8834. Ответов 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
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
27.12.2011, 10:51
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Как получить TID текущего потока? (библиотека pthread, компилятор g++ 4.6.1 открытый вопрос niXmanу) (C++):

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

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

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

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

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

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

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
fasked
Эксперт С++
4936 / 2516 / 180
Регистрация: 07.10.2009
Сообщений: 4,311
Записей в блоге: 1
27.12.2011, 11:15 #2
Вот и нашлись люди, которые расковыривают реализации, не смотря на интерфейсы.
Один вопрос. Какова конечная цель?
0
kravam
быдлокодер
1695 / 882 / 45
Регистрация: 04.06.2008
Сообщений: 5,459
27.12.2011, 11:29  [ТС] #3

Не по теме:

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


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

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

Не по теме:

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

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

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




Но думаю у тех, кто меня знает, язык не повернётся упрекать, чего это я привязался к pthread_self(), если есть GetCurrentThreadid, ибо подобные рекомендации нужны для школоты.
0
fasked
Эксперт С++
4936 / 2516 / 180
Регистрация: 07.10.2009
Сообщений: 4,311
Записей в блоге: 1
27.12.2011, 11:34 #4
kravam, все дело в том, что функция pthread_self должна возвращать pthread_t, что она и делает. А как должен быть представлен тип pthread_t остается на совести разработчиков. И я не вижу смысла его расковыривать.
0
kravam
быдлокодер
1695 / 882 / 45
Регистрация: 04.06.2008
Сообщений: 5,459
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
fasked
Эксперт С++
4936 / 2516 / 180
Регистрация: 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
kravam
быдлокодер
1695 / 882 / 45
Регистрация: 04.06.2008
Сообщений: 5,459
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
fasked
Эксперт С++
4936 / 2516 / 180
Регистрация: 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
kravam
быдлокодер
1695 / 882 / 45
Регистрация: 04.06.2008
Сообщений: 5,459
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
ForEveR
В астрале
Эксперт С++
7972 / 4734 / 321
Регистрация: 24.06.2010
Сообщений: 10,541
Завершенные тесты: 3
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
kravam
быдлокодер
1695 / 882 / 45
Регистрация: 04.06.2008
Сообщений: 5,459
27.12.2011, 19:43  [ТС] #11
Не ну под линь это под линь... Ждём niXmana.

Добавлено через 4 часа 8 минут
Изменение pthread ничего не даёт, при подключении iostream компилятор выдаёт простыню ошибок.
0
niXman
Эксперт C++
3135 / 1447 / 49
Регистрация: 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
kravam
быдлокодер
1695 / 882 / 45
Регистрация: 04.06.2008
Сообщений: 5,459
27.12.2011, 21:39  [ТС] #13
Я хочу получить TID, используя pthread_self(), у меня самого не получается это сделать. Будь добр, напиши как это сделать. А к нужному виду я его сам приведу, будь спок. Могёшь? У меня windows если что.
0
niXman
Эксперт C++
3135 / 1447 / 49
Регистрация: 09.08.2009
Сообщений: 3,441
Записей в блоге: 2
27.12.2011, 21:52 #14
kravam, постом выше мой вопрос. ибо я не понял что именно тебе нужно.

Добавлено через 5 минут
kravam, так же прошу заметить, что pthreads это кроссплатформенный стандарт, который по интерфейсам абстрагирован от используемой платформы. по этому, вопрос прежний - что конкретно тебе нужно чтоб возвращала pthread_self() ?
0
kravam
быдлокодер
1695 / 882 / 45
Регистрация: 04.06.2008
Сообщений: 5,459
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
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
27.12.2011, 21:55
Привет! Вот еще темы с ответами:

Как можно программно открыть ссылку и получить в окне броузера открытый файл? - PHP
Добрый день! Как можно программно открыть ссылку и получить в окне броузера открытый файл? echo'&lt;a...

Как получить Id текущего пользователя? - C# MVC
Доброго времени суток. Использую ASP.NET Identity 2.0. Необходимо получить id пользователя. Нашёл массу ответов о получении логина, но...

Как программно получить IP текущего компьютера? - C#
Как программно получить IP текущего компа? Ну, того, на котором запускается программа? И ещё: как программно определить имя компьютера по...

Как получить SID текущего пользователя? - C#
Как получить SID (тот самый идентификатор безопасности винды) текущего пользователя? Ну и сразу второй вопрос: насколько этот...


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

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
27.12.2011, 21:55
Ответ Создать тему
Опции темы

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