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

C++

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

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

27.12.2011, 10:51. Просмотров 8977. Ответов 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

77
niXman
Эксперт С++
3138 / 1450 / 49
Регистрация: 09.08.2009
Сообщений: 3,441
Записей в блоге: 2
27.12.2011, 21:59 #16
Цитата Сообщение от kravam Посмотреть сообщение
пусть TID будет правильным
он правильный.
или: "что в твоем понимании правильный TID" ?

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

Добавлено через 1 минуту
Цитата Сообщение от kravam Посмотреть сообщение
Можешь?
да. но это не просто. по этому и хочется понять суть, дабы оценить смысл времязатрат.
0
kravam
быдлокодер
1700 / 887 / 45
Регистрация: 04.06.2008
Сообщений: 5,493
27.12.2011, 22:08  [ТС] #17
Ну хорошо. Значит, я думал что правильный TID это тот, который совпадает со значением, вернутым GetCurrentThreadid., но я ошибся. Хорошо. А ты можешь с помощью pthread_self получить TID? (Я не употребляю слово "правильный" заметь но не потому, что хочу получить неправильный. а потому, что чем меньше названий, тем меньше разногласий.)
Итак, как с помощью pthread_self получить TID потока?
0
niXman
Эксперт С++
3138 / 1450 / 49
Регистрация: 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
fasked
Эксперт С++
4945 / 2525 / 180
Регистрация: 07.10.2009
Сообщений: 4,311
Записей в блоге: 1
27.12.2011, 22:48 #19
Цитата Сообщение от niXman Посмотреть сообщение
ТС`а и след пропал. тему можно щитать закрытой.
ТС и сам не знает, чего хочет, видимо.
0
kravam
быдлокодер
1700 / 887 / 45
Регистрация: 04.06.2008
Сообщений: 5,493
27.12.2011, 22:52  [ТС] #20
Да ну конечно, я в туалет ходил.

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

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

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

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

Ну на первый вопрос я получил ответ но возник второй вопрос- зачем нужны такие идентификаторы? Странно, очень странно. Хэндл я с их помощью не получу. Поток однозначно не идентифицирую (последнее было бы возможно, если бы в твою программу добавить getchar() и запустить её два раза и получить 1, 2, 3 и 4 и хотя толку от них было бы мало, но всё вперёд). В общем не могу не сравнить с версией библиотеки pthread, которая у меня была до этого. Там я получал уникальные (не мнимые уникальные, а уникальные уникальные) идентификаторы В ПРЕДЕЛАХ СИСТЕМЫ, от которых была польза, я мог получить, например хэндл потока с их помощью.
Всё это говорено c единственной целью- улучшить g++, а не с целью кого-то обидеть.
0
niXman
Эксперт С++
3138 / 1450 / 49
Регистрация: 09.08.2009
Сообщений: 3,441
Записей в блоге: 2
27.12.2011, 22:59 #21
всего один вопрос: зачем приложению знать о не своих потоках?
0
kravam
быдлокодер
1700 / 887 / 45
Регистрация: 04.06.2008
Сообщений: 5,493
27.12.2011, 23:20  [ТС] #22
Это необходимо в процессе обучения. Навскидку- да изучения системы для. Я вот например время от времени погружаюсь в системное программирование, то есть мне надо уметь увидеть сколько процессов запущено, сколько потоков. Можно конечно, увидеть это с помощью ProcessExplorer, а можно попытаться самому написать примитивную прожку, которая бы сканировала ось и выводила потоки в консоль, что я собсно и делаю. Или вот, например, чел берётся изучать Джефри Рихтера- ну так наверное правильно бы было всё это пощупать тык скыть через руки пропустить? Можно ведь на слово поверить, что вот этот вот поток уснёт

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

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

Добавлено через 3 минуты
что-то я совсем запутался %)
что тебе запрещает юзать GetCurrentThreadid ?
0
alex_x_x
бжни
2449 / 1654 / 84
Регистрация: 14.05.2009
Сообщений: 7,162
27.12.2011, 23:52 #26
Цитата Сообщение от kravam Посмотреть сообщение
Они вот просто закрыли глаза на то, что pthread кпроссплатформенная и сделали вещь.
я не пойму в чем смысл - ты хочешь работать с кроссплатформенным api, но при этом пользоваться системными функциями работы с потоками?
pthread_self возвращает внутренний идентификатор ядра библиотеки и как минимум тем самым защищает себя от ваших манипуляций с ее потоками
0
kravam
быдлокодер
1700 / 887 / 45
Регистрация: 04.06.2008
Сообщений: 5,493
28.12.2011, 00:18  [ТС] #27
Я в одном твёрдо убеждён: если будет так реализовано, что pthred_self будет возвращать то же, что и GetCurrentThreadid, всем будет хорошо, ни одна строчка стандарта не будет нарушена и это будет круто и все (есть кто кроме меня?) кто пользуется такой билблиотекой будут тебе благодарны. А уж хэндл мы сами найдём.

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

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

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

/*
struct _pthread_v;

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

то есть типа намёк, что можно расскоментить и пользоваться? Размышляю над этим.
0
alex_x_x
бжни
2449 / 1654 / 84
Регистрация: 14.05.2009
Сообщений: 7,162
28.12.2011, 00:21 #28
Цитата Сообщение от kravam Посмотреть сообщение
Я в одном твёрдо убеждён: если будет так реализовано, что pthred_self будет возвращать то же, что и GetCurrentThreadid, всем будет хорошо, ни одна строчка стандарта не будет нарушена и это будет круто и все (есть кто кроме меня?) кто пользуется такой билблиотекой будут тебе благодарны. А уж хэндл мы сами найдём.
нет, будет как раз очень плохо, потому что своими грязными ручками можно будет нарушить работу библиотеки, которая об этом подозревать не будет
0
kravam
быдлокодер
1700 / 887 / 45
Регистрация: 04.06.2008
Сообщений: 5,493
28.12.2011, 00:28  [ТС] #29
Спасибо, конечно, но так-то я сам разберусь что мне будет плохо и что хорошо.
0
alex_x_x
бжни
2449 / 1654 / 84
Регистрация: 14.05.2009
Сообщений: 7,162
28.12.2011, 00:30 #30
kravam, верю без труда
так чем не устравивают тогда функции winapi?
0
28.12.2011, 00:30
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
28.12.2011, 00:30
Привет! Вот еще темы с ответами:

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

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

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

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


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

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

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