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

C++

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

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

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

C++ как получить дескриптор файла, открытый функцией fopen
Как получить адрес текущего окна зная его Хендл C++ WinAPI
C++ WinAPI HINSTENCE из текущего потока
C++ вытянуть значение HINSTENCE из текущего потока
Как узнать, что поток закончился (библиотека pthread)? C++
C++ Builder Как получить имя текущего пользователя в Win2000 ?
Как получить имя текущего пользователя Windows? C++ WinAPI
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
fasked
Эксперт С++
4933 / 2513 / 180
Регистрация: 07.10.2009
Сообщений: 4,311
Записей в блоге: 1
27.12.2011, 11:15     Как получить TID текущего потока? (библиотека pthread, компилятор g++ 4.6.1 открытый вопрос niXmanу) #2
Вот и нашлись люди, которые расковыривают реализации, не смотря на интерфейсы.
Один вопрос. Какова конечная цель?
kravam
быдлокодер
1690 / 877 / 44
Регистрация: 04.06.2008
Сообщений: 5,395
27.12.2011, 11:29  [ТС]     Как получить TID текущего потока? (библиотека pthread, компилятор g++ 4.6.1 открытый вопрос niXmanу) #3

Не по теме:

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


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

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

Не по теме:

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

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

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




Но думаю у тех, кто меня знает, язык не повернётся упрекать, чего это я привязался к pthread_self(), если есть GetCurrentThreadid, ибо подобные рекомендации нужны для школоты.
fasked
Эксперт С++
4933 / 2513 / 180
Регистрация: 07.10.2009
Сообщений: 4,311
Записей в блоге: 1
27.12.2011, 11:34     Как получить TID текущего потока? (библиотека pthread, компилятор g++ 4.6.1 открытый вопрос niXmanу) #4
kravam, все дело в том, что функция pthread_self должна возвращать pthread_t, что она и делает. А как должен быть представлен тип pthread_t остается на совести разработчиков. И я не вижу смысла его расковыривать.
kravam
быдлокодер
1690 / 877 / 44
Регистрация: 04.06.2008
Сообщений: 5,395
27.12.2011, 11:47  [ТС]     Как получить TID текущего потока? (библиотека pthread, компилятор g++ 4.6.1 открытый вопрос niXmanу) #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."

Вот пусть оно так и будет.
fasked
Эксперт С++
4933 / 2513 / 180
Регистрация: 07.10.2009
Сообщений: 4,311
Записей в блоге: 1
27.12.2011, 12:32     Как получить TID текущего потока? (библиотека pthread, компилятор g++ 4.6.1 открытый вопрос niXmanу) #6
Цитата Сообщение от kravam Посмотреть сообщение
А тип возвращаемого значения меня интересует постольку поскольку. Мне нужен коректный TID. Всё! Написано в стандарте:
"DESCRIPTION
The pthread_self() function returns the thread ID of the calling thread."
Ок, спрошу еще раз: чем pthread_t не ID?
kravam
быдлокодер
1690 / 877 / 44
Регистрация: 04.06.2008
Сообщений: 5,395
27.12.2011, 13:21  [ТС]     Как получить TID текущего потока? (библиотека pthread, компилятор g++ 4.6.1 открытый вопрос niXmanу) #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 ();
}
fasked
Эксперт С++
4933 / 2513 / 180
Регистрация: 07.10.2009
Сообщений: 4,311
Записей в блоге: 1
27.12.2011, 14:40     Как получить TID текущего потока? (библиотека pthread, компилятор g++ 4.6.1 открытый вопрос niXmanу) #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 Посмотреть сообщение
Этот код надо запустить два раза:
С радостью бы, но винды не имею.
kravam
быдлокодер
1690 / 877 / 44
Регистрация: 04.06.2008
Сообщений: 5,395
27.12.2011, 15:11  [ТС]     Как получить TID текущего потока? (библиотека pthread, компилятор g++ 4.6.1 открытый вопрос niXmanу) #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;
Я ведь писал уже об этом. Всё, это тупик. Это не структура. Чё дальше делать я не знаю.
ForEveR
Модератор
Эксперт С++
7958 / 4720 / 319
Регистрация: 24.06.2010
Сообщений: 10,525
Завершенные тесты: 3
27.12.2011, 15:24     Как получить TID текущего потока? (библиотека pthread, компилятор g++ 4.6.1 открытый вопрос niXmanу) #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
kravam
быдлокодер
1690 / 877 / 44
Регистрация: 04.06.2008
Сообщений: 5,395
27.12.2011, 19:43  [ТС]     Как получить TID текущего потока? (библиотека pthread, компилятор g++ 4.6.1 открытый вопрос niXmanу) #11
Не ну под линь это под линь... Ждём niXmana.

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

Добавлено через 5 минут
kravam, так же прошу заметить, что pthreads это кроссплатформенный стандарт, который по интерфейсам абстрагирован от используемой платформы. по этому, вопрос прежний - что конкретно тебе нужно чтоб возвращала pthread_self() ?
kravam
быдлокодер
1690 / 877 / 44
Регистрация: 04.06.2008
Сообщений: 5,395
27.12.2011, 21:55  [ТС]     Как получить TID текущего потока? (библиотека pthread, компилятор g++ 4.6.1 открытый вопрос niXmanу) #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", раньше у меня так получалось.
niXman
Эксперт C++
3134 / 1446 / 49
Регистрация: 09.08.2009
Сообщений: 3,441
Записей в блоге: 2
27.12.2011, 21:59     Как получить TID текущего потока? (библиотека pthread, компилятор g++ 4.6.1 открытый вопрос niXmanу) #16
Цитата Сообщение от kravam Посмотреть сообщение
пусть TID будет правильным
он правильный.
или: "что в твоем понимании правильный TID" ?

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

Добавлено через 1 минуту
Цитата Сообщение от kravam Посмотреть сообщение
Можешь?
да. но это не просто. по этому и хочется понять суть, дабы оценить смысл времязатрат.
kravam
быдлокодер
1690 / 877 / 44
Регистрация: 04.06.2008
Сообщений: 5,395
27.12.2011, 22:08  [ТС]     Как получить TID текущего потока? (библиотека pthread, компилятор g++ 4.6.1 открытый вопрос niXmanу) #17
Ну хорошо. Значит, я думал что правильный TID это тот, который совпадает со значением, вернутым GetCurrentThreadid., но я ошибся. Хорошо. А ты можешь с помощью pthread_self получить TID? (Я не употребляю слово "правильный" заметь но не потому, что хочу получить неправильный. а потому, что чем меньше названий, тем меньше разногласий.)
Итак, как с помощью pthread_self получить TID потока?
niXman
Эксперт C++
3134 / 1446 / 49
Регистрация: 09.08.2009
Сообщений: 3,441
Записей в блоге: 2
27.12.2011, 22:38     Как получить TID текущего потока? (библиотека pthread, компилятор g++ 4.6.1 открытый вопрос niXmanу) #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 минут
ТС`а и след пропал. тему можно щитать закрытой.
fasked
Эксперт С++
4933 / 2513 / 180
Регистрация: 07.10.2009
Сообщений: 4,311
Записей в блоге: 1
27.12.2011, 22:48     Как получить TID текущего потока? (библиотека pthread, компилятор g++ 4.6.1 открытый вопрос niXmanу) #19
Цитата Сообщение от niXman Посмотреть сообщение
ТС`а и след пропал. тему можно щитать закрытой.
ТС и сам не знает, чего хочет, видимо.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
27.12.2011, 22:52     Как получить TID текущего потока? (библиотека pthread, компилятор g++ 4.6.1 открытый вопрос niXmanу)
Еще ссылки по теме:

C++ Linux Приоритет потока (pthread)
библиотека pthread.h в Code::Blocks C++
Получить открытый текст C++
Компилятор MinGW в NetBeans не видит класс потока (thread) C++
C++ Pthread функция потока внутри класса

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

Или воспользуйтесь поиском по форуму:
kravam
быдлокодер
1690 / 877 / 44
Регистрация: 04.06.2008
Сообщений: 5,395
27.12.2011, 22:52  [ТС]     Как получить TID текущего потока? (библиотека pthread, компилятор g++ 4.6.1 открытый вопрос niXmanу) #20
Да ну конечно, я в туалет ходил.

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

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

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

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

Ну на первый вопрос я получил ответ но возник второй вопрос- зачем нужны такие идентификаторы? Странно, очень странно. Хэндл я с их помощью не получу. Поток однозначно не идентифицирую (последнее было бы возможно, если бы в твою программу добавить getchar() и запустить её два раза и получить 1, 2, 3 и 4 и хотя толку от них было бы мало, но всё вперёд). В общем не могу не сравнить с версией библиотеки pthread, которая у меня была до этого. Там я получал уникальные (не мнимые уникальные, а уникальные уникальные) идентификаторы В ПРЕДЕЛАХ СИСТЕМЫ, от которых была польза, я мог получить, например хэндл потока с их помощью.
Всё это говорено c единственной целью- улучшить g++, а не с целью кого-то обидеть.
Yandex
Объявления
27.12.2011, 22:52     Как получить TID текущего потока? (библиотека pthread, компилятор g++ 4.6.1 открытый вопрос niXmanу)
Ответ Создать тему
Опции темы

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