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

C++

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

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

27.12.2011, 10:51. Просмотров 8531. Ответов 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у)
Посмотрите здесь:
Как узнать, что поток закончился (библиотека pthread)? C++
C++ Linux Приоритет потока (pthread)
библиотека pthread.h в Code::Blocks C++
C++ Pthread функция потока внутри класса
C++ как получить дескриптор файла, открытый функцией fopen
C++ WinAPI HINSTENCE из текущего потока
Как получить имя текущего пользователя Windows? C++ WinAPI
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
niXman
Эксперт C++
3134 / 1446 / 49
Регистрация: 09.08.2009
Сообщений: 3,441
Записей в блоге: 2
27.12.2011, 22:59     Как получить TID текущего потока? (библиотека pthread, компилятор g++ 4.6.1 открытый вопрос niXmanу) #21
всего один вопрос: зачем приложению знать о не своих потоках?
kravam
быдлокодер
1691 / 878 / 44
Регистрация: 04.06.2008
Сообщений: 5,411
27.12.2011, 23:20  [ТС]     Как получить TID текущего потока? (библиотека pthread, компилятор g++ 4.6.1 открытый вопрос niXmanу) #22
Это необходимо в процессе обучения. Навскидку- да изучения системы для. Я вот например время от времени погружаюсь в системное программирование, то есть мне надо уметь увидеть сколько процессов запущено, сколько потоков. Можно конечно, увидеть это с помощью ProcessExplorer, а можно попытаться самому написать примитивную прожку, которая бы сканировала ось и выводила потоки в консоль, что я собсно и делаю. Или вот, например, чел берётся изучать Джефри Рихтера- ну так наверное правильно бы было всё это пощупать тык скыть через руки пропустить? Можно ведь на слово поверить, что вот этот вот поток уснёт

C++
1
OpenThread(THREAD_SUSPEND_RESUME, FALSE, TID);
а можно и прроверить на практике.

Для учёбы, короче. Пока не соображу для чего ещё.
niXman
Эксперт C++
3134 / 1446 / 49
Регистрация: 09.08.2009
Сообщений: 3,441
Записей в блоге: 2
27.12.2011, 23:31     Как получить TID текущего потока? (библиотека pthread, компилятор g++ 4.6.1 открытый вопрос niXmanу) #23
Цитата Сообщение от kravam Посмотреть сообщение
надо уметь увидеть сколько процессов запущено, сколько потоков.
для этого существует proc fs
Цитата Сообщение от kravam Посмотреть сообщение
которая бы сканировала ось и выводила потоки в консоль, что я собсно и делаю. Или вот, например, чел берётся изучать Джефри Рихтера- ну так наверное правильно бы было всё это пощупать тык скыть через руки пропустить? Можно ведь на слово поверить, что вот этот вот поток уснёт
ты говоришь о программировании специфичном для конкретной платформы. pthreads же - кроссплатформенное API.
kravam
быдлокодер
1691 / 878 / 44
Регистрация: 04.06.2008
Сообщений: 5,411
27.12.2011, 23:33  [ТС]     Как получить TID текущего потока? (библиотека pthread, компилятор g++ 4.6.1 открытый вопрос niXmanу) #24
Да я уж понял что она для моих целей не подойдёт. И только одна мысль свербит- неужели неправы были те дядьки, которые так реализовали pthread, что pthread_self возвращала тот же TID , что и GetCurrentThreadid? Они вот просто закрыли глаза на то, что pthread кпроссплатформенная и сделали вещь.
niXman
Эксперт C++
3134 / 1446 / 49
Регистрация: 09.08.2009
Сообщений: 3,441
Записей в блоге: 2
27.12.2011, 23:42     Как получить TID текущего потока? (библиотека pthread, компилятор g++ 4.6.1 открытый вопрос niXmanу) #25
kravam, если сильно невмоготу, то могу себе в туду`шку записать о необходимости предоставить функцию, которая бы из pthread_self() результата, возвращала вендовый хендл.

Добавлено через 3 минуты
что-то я совсем запутался %)
что тебе запрещает юзать GetCurrentThreadid ?
alex_x_x
бжни
2445 / 1650 / 84
Регистрация: 14.05.2009
Сообщений: 7,162
27.12.2011, 23:52     Как получить TID текущего потока? (библиотека pthread, компилятор g++ 4.6.1 открытый вопрос niXmanу) #26
Цитата Сообщение от kravam Посмотреть сообщение
Они вот просто закрыли глаза на то, что pthread кпроссплатформенная и сделали вещь.
я не пойму в чем смысл - ты хочешь работать с кроссплатформенным api, но при этом пользоваться системными функциями работы с потоками?
pthread_self возвращает внутренний идентификатор ядра библиотеки и как минимум тем самым защищает себя от ваших манипуляций с ее потоками
kravam
быдлокодер
1691 / 878 / 44
Регистрация: 04.06.2008
Сообщений: 5,411
28.12.2011, 00:18  [ТС]     Как получить TID текущего потока? (библиотека pthread, компилятор g++ 4.6.1 открытый вопрос niXmanу) #27
Я в одном твёрдо убеждён: если будет так реализовано, что pthred_self будет возвращать то же, что и GetCurrentThreadid, всем будет хорошо, ни одна строчка стандарта не будет нарушена и это будет круто и все (есть кто кроме меня?) кто пользуется такой билблиотекой будут тебе благодарны. А уж хэндл мы сами найдём.

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

Да ничто мне не запрещает, куда ж я денусь-то, буду использовать GetCurrentThreadid. Но ты тоже пойми мою настойчивость, я понимаю, когда функции реализованы по-разному, но когда они реализованы настолько по-разному, я не мог пройти мимо этого факта. Не ну как, одна возвращает 1, а другая 501. И ни объяснений ни полобъяснений. Какой уважающий себя исследователь пройдёт мимо этого факта? Ну короче надо вот было мне выяснить и всё тут.

А ты не знаешь, это может значить что-то важное? В pthread.h это закомменчено:

/*
struct _pthread_v;

typedef struct pthread_t {
struct _pthread_v *p;
int x;
} pthread_t;
*/

то есть типа намёк, что можно расскоментить и пользоваться? Размышляю над этим.
alex_x_x
бжни
2445 / 1650 / 84
Регистрация: 14.05.2009
Сообщений: 7,162
28.12.2011, 00:21     Как получить TID текущего потока? (библиотека pthread, компилятор g++ 4.6.1 открытый вопрос niXmanу) #28
Цитата Сообщение от kravam Посмотреть сообщение
Я в одном твёрдо убеждён: если будет так реализовано, что pthred_self будет возвращать то же, что и GetCurrentThreadid, всем будет хорошо, ни одна строчка стандарта не будет нарушена и это будет круто и все (есть кто кроме меня?) кто пользуется такой билблиотекой будут тебе благодарны. А уж хэндл мы сами найдём.
нет, будет как раз очень плохо, потому что своими грязными ручками можно будет нарушить работу библиотеки, которая об этом подозревать не будет
kravam
быдлокодер
1691 / 878 / 44
Регистрация: 04.06.2008
Сообщений: 5,411
28.12.2011, 00:28  [ТС]     Как получить TID текущего потока? (библиотека pthread, компилятор g++ 4.6.1 открытый вопрос niXmanу) #29
Спасибо, конечно, но так-то я сам разберусь что мне будет плохо и что хорошо.
alex_x_x
бжни
2445 / 1650 / 84
Регистрация: 14.05.2009
Сообщений: 7,162
28.12.2011, 00:30     Как получить TID текущего потока? (библиотека pthread, компилятор g++ 4.6.1 открытый вопрос niXmanу) #30
kravam, верю без труда
так чем не устравивают тогда функции winapi?
kravam
быдлокодер
1691 / 878 / 44
Регистрация: 04.06.2008
Сообщений: 5,411
28.12.2011, 00:34  [ТС]     Как получить TID текущего потока? (библиотека pthread, компилятор g++ 4.6.1 открытый вопрос niXmanу) #31
Повторяю:
Но ты тоже пойми мою настойчивость, я понимаю, когда функции реализованы по-разному, но когда они реализованы настолько по-разному, я не мог пройти мимо этого факта. Не ну как, одна возвращает 1, а другая 501. И ни объяснений ни полобъяснений. Какой уважающий себя исследователь пройдёт мимо этого факта? Ну короче надо вот было мне выяснить и всё тут.
xecu91
3 / 3 / 0
Регистрация: 09.01.2012
Сообщений: 28
10.01.2012, 16:07     Как получить TID текущего потока? (библиотека pthread, компилятор g++ 4.6.1 открытый вопрос niXmanу) #32
А нельзя скармливать номер потока как аргумент функции в pthread_create ?
kravam
быдлокодер
1691 / 878 / 44
Регистрация: 04.06.2008
Сообщений: 5,411
10.01.2012, 16:14  [ТС]     Как получить TID текущего потока? (библиотека pthread, компилятор g++ 4.6.1 открытый вопрос niXmanу) #33
Как же скармливать ей номер потока ккоторый ещё не существует? Она ведь его создаёт!

Не по теме:

Что бы продать что-нибудь ненужное, надо купить что-нибудь ненужное, а у нас денег нет

xecu91
3 / 3 / 0
Регистрация: 09.01.2012
Сообщений: 28
10.01.2012, 17:40     Как получить TID текущего потока? (библиотека pthread, компилятор g++ 4.6.1 открытый вопрос niXmanу) #34
Прототип функции pthread_create:
C++
1
2
3
pthread_create(pthread_t *restrict thread,
         const pthread_attr_t *restrict attr, void *(*start_routine)(void *),
         void *restrict arg);
третий аргумент - указатель на функцию, с которой следует начать выполнение потока, последний - её аргументы, приведенные к void*. Именно в этих аргументах и можно скормить номер потока. Вообще обычно эти аргументы делаются структурой:
C++
1
2
3
4
5
6
struct arg
{
     int thread_num;
     int total_threads;
     //everything else
};
после чего создаётся массив аргументов arg *args = new arg[p] , массив потоков, запускается каждый поток со своими аргументами (i-й поток имеет аргументы args[i]), ждём завершения всех потоков pthread_join-ом и всё.
NoMasters
Псевдослучайный
1744 / 1087 / 71
Регистрация: 13.09.2011
Сообщений: 3,115
10.01.2012, 20:05     Как получить TID текущего потока? (библиотека pthread, компилятор g++ 4.6.1 открытый вопрос niXmanу) #35
Я видел вот такой вариант получения TID:
C
1
2
3
4
5
#include <unistd.h>
...
_syscall0(pid_t,gettid);
pid_t my_tid;
my_tid = gettid();
Но что-то я сомневаюсь в его кроссплотформенности.
При этом
Цитата Сообщение от man gettid
The thread ID returned by this call is not the same thing as a POSIX thread ID (i.e., the opaque value returned by pthread_self(3)).
Добавлено через 2 минуты
Вчитался в ман, это чисто линуксовая фича
Цитата Сообщение от man gettid
gettid() is Linux-specific and should not be used in programs that are
intended to be portable.
kravam
быдлокодер
1691 / 878 / 44
Регистрация: 04.06.2008
Сообщений: 5,411
10.01.2012, 20:33  [ТС]     Как получить TID текущего потока? (библиотека pthread, компилятор g++ 4.6.1 открытый вопрос niXmanу) #36
Можно качнуть другие сборки, где библиотека pthread неинтегрирована, а потом вот эту версию ptgread поставить: http://sourceware.org/pthreads-win32/
niXman
Эксперт C++
3134 / 1446 / 49
Регистрация: 09.08.2009
Сообщений: 3,441
Записей в блоге: 2
10.01.2012, 22:34     Как получить TID текущего потока? (библиотека pthread, компилятор g++ 4.6.1 открытый вопрос niXmanу) #37
kravam, повторю, всем интересный, неоднократно заданный, вопрос: для чего может понадобиться в кроссовом API хэндл потока, специфичной платформы?
ты хоть противоречие замечаешь?
kravam
быдлокодер
1691 / 878 / 44
Регистрация: 04.06.2008
Сообщений: 5,411
10.01.2012, 23:24  [ТС]     Как получить TID текущего потока? (библиотека pthread, компилятор g++ 4.6.1 открытый вопрос niXmanу) #38
Не замечаю, ибо с терминами не разобрался, мне некогда, извини.
retmas
Жарю без масла
859 / 741 / 164
Регистрация: 13.01.2012
Сообщений: 1,694
15.01.2012, 20:56     Как получить TID текущего потока? (библиотека pthread, компилятор g++ 4.6.1 открытый вопрос niXmanу) #39
Цитата Сообщение от kravam Посмотреть сообщение
Повторяю:
Но ты тоже пойми мою настойчивость, я понимаю, когда функции реализованы по-разному, но когда они реализованы настолько по-разному, я не мог пройти мимо этого факта. Не ну как, одна возвращает 1, а другая 501.
потому что это разные ф-ии, которые могут возвращать разные данные.
кто сказал, что ID потока в pthreads - это то же самое, что ID потока в Win API.
общего у них только то, что их обозвали одинаково - ID
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
15.01.2012, 21:22     Как получить TID текущего потока? (библиотека pthread, компилятор g++ 4.6.1 открытый вопрос niXmanу)
Еще ссылки по теме:
C++ Builder Как получить имя текущего пользователя в Win2000 ?
C++ вытянуть значение HINSTENCE из текущего потока
Как получить адрес текущего окна зная его Хендл C++ WinAPI
Получить открытый текст C++
Компилятор MinGW в NetBeans не видит класс потока (thread) C++

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

Или воспользуйтесь поиском по форуму:
kravam
быдлокодер
1691 / 878 / 44
Регистрация: 04.06.2008
Сообщений: 5,411
15.01.2012, 21:22  [ТС]     Как получить TID текущего потока? (библиотека pthread, компилятор g++ 4.6.1 открытый вопрос niXmanу) #40
Ну так-то да, щас уж вопрос из какого значения можно извлечь больше пользы. И сдаётся мне, щас кто-то спросит, зачем приложению знать о чужих потоках...
Yandex
Объявления
15.01.2012, 21:22     Как получить TID текущего потока? (библиотека pthread, компилятор g++ 4.6.1 открытый вопрос niXmanу)
Ответ Создать тему
Опции темы

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