Форум программистов, компьютерный форум, киберфорум
C++
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.57/98: Рейтинг темы: голосов - 98, средняя оценка - 4.57
быдлокодер
 Аватар для kravam
1724 / 911 / 106
Регистрация: 04.06.2008
Сообщений: 5,705

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

27.12.2011, 10:51. Показов 19822. Ответов 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
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
27.12.2011, 10:51
Ответы с готовыми решениями:

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

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

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

77
Эксперт С++
 Аватар для niXman
3211 / 1459 / 74
Регистрация: 09.08.2009
Сообщений: 3,441
Записей в блоге: 2
27.12.2011, 22:59
Студворк — интернет-сервис помощи студентам
всего один вопрос: зачем приложению знать о не своих потоках?
0
быдлокодер
 Аватар для kravam
1724 / 911 / 106
Регистрация: 04.06.2008
Сообщений: 5,705
27.12.2011, 23:20  [ТС]
Это необходимо в процессе обучения. Навскидку- да изучения системы для. Я вот например время от времени погружаюсь в системное программирование, то есть мне надо уметь увидеть сколько процессов запущено, сколько потоков. Можно конечно, увидеть это с помощью ProcessExplorer, а можно попытаться самому написать примитивную прожку, которая бы сканировала ось и выводила потоки в консоль, что я собсно и делаю. Или вот, например, чел берётся изучать Джефри Рихтера- ну так наверное правильно бы было всё это пощупать тык скыть через руки пропустить? Можно ведь на слово поверить, что вот этот вот поток уснёт

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

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

Добавлено через 3 минуты
что-то я совсем запутался %)
что тебе запрещает юзать GetCurrentThreadid ?
0
бжни
 Аватар для alex_x_x
2473 / 1684 / 135
Регистрация: 14.05.2009
Сообщений: 7,162
27.12.2011, 23:52
Цитата Сообщение от kravam Посмотреть сообщение
Они вот просто закрыли глаза на то, что pthread кпроссплатформенная и сделали вещь.
я не пойму в чем смысл - ты хочешь работать с кроссплатформенным api, но при этом пользоваться системными функциями работы с потоками?
pthread_self возвращает внутренний идентификатор ядра библиотеки и как минимум тем самым защищает себя от ваших манипуляций с ее потоками
0
быдлокодер
 Аватар для kravam
1724 / 911 / 106
Регистрация: 04.06.2008
Сообщений: 5,705
28.12.2011, 00:18  [ТС]
Я в одном твёрдо убеждён: если будет так реализовано, что 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
2473 / 1684 / 135
Регистрация: 14.05.2009
Сообщений: 7,162
28.12.2011, 00:21
Цитата Сообщение от kravam Посмотреть сообщение
Я в одном твёрдо убеждён: если будет так реализовано, что pthred_self будет возвращать то же, что и GetCurrentThreadid, всем будет хорошо, ни одна строчка стандарта не будет нарушена и это будет круто и все (есть кто кроме меня?) кто пользуется такой билблиотекой будут тебе благодарны. А уж хэндл мы сами найдём.
нет, будет как раз очень плохо, потому что своими грязными ручками можно будет нарушить работу библиотеки, которая об этом подозревать не будет
0
быдлокодер
 Аватар для kravam
1724 / 911 / 106
Регистрация: 04.06.2008
Сообщений: 5,705
28.12.2011, 00:28  [ТС]
Спасибо, конечно, но так-то я сам разберусь что мне будет плохо и что хорошо.
0
бжни
 Аватар для alex_x_x
2473 / 1684 / 135
Регистрация: 14.05.2009
Сообщений: 7,162
28.12.2011, 00:30
kravam, верю без труда
так чем не устравивают тогда функции winapi?
0
быдлокодер
 Аватар для kravam
1724 / 911 / 106
Регистрация: 04.06.2008
Сообщений: 5,705
28.12.2011, 00:34  [ТС]
Повторяю:
Но ты тоже пойми мою настойчивость, я понимаю, когда функции реализованы по-разному, но когда они реализованы настолько по-разному, я не мог пройти мимо этого факта. Не ну как, одна возвращает 1, а другая 501. И ни объяснений ни полобъяснений. Какой уважающий себя исследователь пройдёт мимо этого факта? Ну короче надо вот было мне выяснить и всё тут.
0
3 / 3 / 0
Регистрация: 09.01.2012
Сообщений: 28
10.01.2012, 16:07
А нельзя скармливать номер потока как аргумент функции в pthread_create ?
0
быдлокодер
 Аватар для kravam
1724 / 911 / 106
Регистрация: 04.06.2008
Сообщений: 5,705
10.01.2012, 16:14  [ТС]
Как же скармливать ей номер потока ккоторый ещё не существует? Она ведь его создаёт!

Не по теме:

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

0
3 / 3 / 0
Регистрация: 09.01.2012
Сообщений: 28
10.01.2012, 17:40
Прототип функции 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-ом и всё.
0
Псевдослучайный
1946 / 1146 / 98
Регистрация: 13.09.2011
Сообщений: 3,215
10.01.2012, 20:05
Я видел вот такой вариант получения 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.
0
быдлокодер
 Аватар для kravam
1724 / 911 / 106
Регистрация: 04.06.2008
Сообщений: 5,705
10.01.2012, 20:33  [ТС]
Можно качнуть другие сборки, где библиотека pthread неинтегрирована, а потом вот эту версию ptgread поставить: http://sourceware.org/pthreads-win32/
0
Эксперт С++
 Аватар для niXman
3211 / 1459 / 74
Регистрация: 09.08.2009
Сообщений: 3,441
Записей в блоге: 2
10.01.2012, 22:34
kravam, повторю, всем интересный, неоднократно заданный, вопрос: для чего может понадобиться в кроссовом API хэндл потока, специфичной платформы?
ты хоть противоречие замечаешь?
0
быдлокодер
 Аватар для kravam
1724 / 911 / 106
Регистрация: 04.06.2008
Сообщений: 5,705
10.01.2012, 23:24  [ТС]
Не замечаю, ибо с терминами не разобрался, мне некогда, извини.
0
Жарю без масла
867 / 749 / 225
Регистрация: 13.01.2012
Сообщений: 1,702
15.01.2012, 20:56
Цитата Сообщение от kravam Посмотреть сообщение
Повторяю:
Но ты тоже пойми мою настойчивость, я понимаю, когда функции реализованы по-разному, но когда они реализованы настолько по-разному, я не мог пройти мимо этого факта. Не ну как, одна возвращает 1, а другая 501.
потому что это разные ф-ии, которые могут возвращать разные данные.
кто сказал, что ID потока в pthreads - это то же самое, что ID потока в Win API.
общего у них только то, что их обозвали одинаково - ID
0
быдлокодер
 Аватар для kravam
1724 / 911 / 106
Регистрация: 04.06.2008
Сообщений: 5,705
15.01.2012, 21:22  [ТС]
Ну так-то да, щас уж вопрос из какого значения можно извлечь больше пользы. И сдаётся мне, щас кто-то спросит, зачем приложению знать о чужих потоках...
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
15.01.2012, 21:22

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

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

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

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

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


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

Или воспользуйтесь поиском по форуму:
40
Ответ Создать тему
Новые блоги и статьи
Сезонность и суточность закисления почв
anaschu 04.07.2026
200 часов это все равно моловато. Есть ситуации, но нестандартные, когда смена происходит за 5 лет. Но обычно это 50 лет и более. Наверное, закисление почвы происходит сезонно в средней. . .
В чем ценность человеческого опыта в глобальном смысле?
kumehtar 03.07.2026
Возможно, ценность человека не в том, что он однажды достигает мудрости, а в том, что он становится носителем карты пути. Он знает не только истину, но и последовательность внутренних изменений,. . .
интеграция AnyLogic с самописным REST API и переход на Odoo
anaschu 03.07.2026
Успешная интеграция AnyLogic с самописным REST API и переход на промышленную Odoo WMS Сегодня проделал огромный путь от простой симуляции физических процессов до построения полноценной. . .
Поиск всех путей на ориентированном графе. Linux
dcc0 02.07.2026
Переработка старого кода из моей статьи. Через несколько переработок от PHP кода к C89 (надеюсь, 89). Но довольно запутанно получилось. Код для Linux. Но если убрать time и то, что с ним. . .
Сам себя обучал rest api
anaschu 02.07.2026
Педагогический лайфхак: Почему чистый REST API для ученика намного круче, чем готовые библиотеки Когда мы отказались от капризного JAR-файла AnyLogic и переписали код на стандартный HttpClient,. . .
rest api anylogic - выполнение модели на своём русском сайте
anaschu 02.07.2026
Как подружиться с AnyLogic Cloud API, победить провайдеров и развернуться Java-бэкенд в Docker на бесплатном хостинге: Двухдневный лог борьбы Всем привет! Хочу поделиться свежим (и довольно. . .
Где деньги лежат
kumehtar 02.07.2026
Это - японская подводная лодка I-52 (тип C2, кодовое имя Momi) вышла из Японии в марте 1944 года с миссией в оккупированную немцами Францию (Лорьян). Это была одна из «Янаги»-миссий по обмену. . .
Krabik для WoW 3.3.5a, многоязычный
AmbA 02.07.2026
Допилил бота, думаю что окончательно. Изменения: - добавлена многоязычность - добавлено снятие скриншотов - добавлено поддержание бафов хождения по воде (для жреца, дк и шамана) - и так, по. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru