Форум программистов, компьютерный форум, киберфорум
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. Показов 19779. Ответов 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
Ответ Создать тему
Новые блоги и статьи
23. что сделано за последнее время.
anaschu 17.06.2026
• Эталон: Клиника НИИ питания РАМН, Москва — централизованный пищеблок, 225 коек, 180 пациентов • Git: репозиторий med2, ветка абсентеизм. Рабочий файл: СРесурсами1_v4. alp • Смежный проект:. . .
22. Подключение слоя системной динамики (потоковые диффуры): экономические метрики модели
anaschu 17.06.2026
Апдейт модели: финансовый контур, разделение затрат Продолжаю развивать модель рабочего коллектива на AnyLogic. В этот раз работа шла над агентом Экономика — финансовым SD-слоем модели. Задача:. . .
[golang] Insert Delete GetRandom O(1) (Leetcode: 380)
alhaos 16.06.2026
Insert Delete GetRandom O(1) Сложность: Medium Источник: LeetCode 380 Задача Реализовать структуру данных RandomizedSet, которая поддерживает следующие операции за O(1) в среднем:
Свет в конце тоннеля
kumehtar 16.06.2026
Поймал себя на одной мысли. Раньше мне всегда казалось неправильным жить без чёткого понимания, куда всё идёт. Будто я иду по дороге судьбы, но не знаю, куда она ведёт. А раз не знаю — значит,. . .
[golang] Реализация стека с поддержкой получения минимального элемента за O(1)
alhaos 16.06.2026
Min Stack Сложность: Medium Источник: LeetCode 155 Задача: Реализовать стек который поддерживает push, pop, top и получение минимального элемента за O(1). Методы:
[golang] Конкурентный fetcher с ограничением максимального количества одновременных HTTP запросов.
alhaos 10.06.2026
Задача Реализовать конкурентный fetcher с ограничением максимального количества одновременных HTTP запросов. Сигнатура func Fetch(urls string, maxConcurrent int) Result Пример urls :=. . .
[golang] Состояние гонки (race condition)
alhaos 10.06.2026
Состояние гонки (race condition) Состояние гонки (Race Condition) — это ошибка, возникающая при одновременном доступе нескольких горутин к одним и тем же данным без должной синхронизации. При этом. . .
Взрослые отношения, и почему они не получаются
kumehtar 09.06.2026
Когда в детстве ребёнок не получает от родителей чего-то важного, он лишается не просто приятных переживаний, а основы для формирования определённых внутренних качеств и навыков. Если ребёнок не. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru