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

C++

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

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

27.12.2011, 10:51. Просмотров 9117. Ответов 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
kravam
быдлокодер
1703 / 890 / 45
Регистрация: 04.06.2008
Сообщений: 5,489
28.12.2011, 00:34  [ТС] #31
Повторяю:
Но ты тоже пойми мою настойчивость, я понимаю, когда функции реализованы по-разному, но когда они реализованы настолько по-разному, я не мог пройти мимо этого факта. Не ну как, одна возвращает 1, а другая 501. И ни объяснений ни полобъяснений. Какой уважающий себя исследователь пройдёт мимо этого факта? Ну короче надо вот было мне выяснить и всё тут.
0
xecu91
3 / 3 / 0
Регистрация: 09.01.2012
Сообщений: 28
10.01.2012, 16:07 #32
А нельзя скармливать номер потока как аргумент функции в pthread_create ?
0
kravam
быдлокодер
1703 / 890 / 45
Регистрация: 04.06.2008
Сообщений: 5,489
10.01.2012, 16:14  [ТС] #33
Как же скармливать ей номер потока ккоторый ещё не существует? Она ведь его создаёт!

Не по теме:

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

0
xecu91
3 / 3 / 0
Регистрация: 09.01.2012
Сообщений: 28
10.01.2012, 17:40 #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-ом и всё.
0
NoMasters
Псевдослучайный
1764 / 1107 / 73
Регистрация: 13.09.2011
Сообщений: 3,148
10.01.2012, 20:05 #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.
0
kravam
быдлокодер
1703 / 890 / 45
Регистрация: 04.06.2008
Сообщений: 5,489
10.01.2012, 20:33  [ТС] #36
Можно качнуть другие сборки, где библиотека pthread неинтегрирована, а потом вот эту версию ptgread поставить: http://sourceware.org/pthreads-win32/
0
niXman
Эксперт С++
3139 / 1451 / 49
Регистрация: 09.08.2009
Сообщений: 3,441
Записей в блоге: 2
10.01.2012, 22:34 #37
kravam, повторю, всем интересный, неоднократно заданный, вопрос: для чего может понадобиться в кроссовом API хэндл потока, специфичной платформы?
ты хоть противоречие замечаешь?
0
kravam
быдлокодер
1703 / 890 / 45
Регистрация: 04.06.2008
Сообщений: 5,489
10.01.2012, 23:24  [ТС] #38
Не замечаю, ибо с терминами не разобрался, мне некогда, извини.
0
retmas
Жарю без масла
864 / 746 / 168
Регистрация: 13.01.2012
Сообщений: 1,702
15.01.2012, 20:56 #39
Цитата Сообщение от kravam Посмотреть сообщение
Повторяю:
Но ты тоже пойми мою настойчивость, я понимаю, когда функции реализованы по-разному, но когда они реализованы настолько по-разному, я не мог пройти мимо этого факта. Не ну как, одна возвращает 1, а другая 501.
потому что это разные ф-ии, которые могут возвращать разные данные.
кто сказал, что ID потока в pthreads - это то же самое, что ID потока в Win API.
общего у них только то, что их обозвали одинаково - ID
0
kravam
быдлокодер
1703 / 890 / 45
Регистрация: 04.06.2008
Сообщений: 5,489
15.01.2012, 21:22  [ТС] #40
Ну так-то да, щас уж вопрос из какого значения можно извлечь больше пользы. И сдаётся мне, щас кто-то спросит, зачем приложению знать о чужих потоках...
0
retmas
Жарю без масла
864 / 746 / 168
Регистрация: 13.01.2012
Сообщений: 1,702
15.01.2012, 22:38 #41
Цитата Сообщение от kravam Посмотреть сообщение
вопрос из какого значения можно извлечь больше пользы.
не из какого. не имеет смысла. потому, что
Цитата Сообщение от retmas Посмотреть сообщение
это разные ф-ии, которые могут возвращать разные данные.
читай - никак не связанные данные
а если
Цитата Сообщение от kravam Посмотреть сообщение
Ну так-то да
то о какой пользе тут можно говорить?
то же самое, что: "что лучше - круглое или красное".
0
kravam
быдлокодер
1703 / 890 / 45
Регистрация: 04.06.2008
Сообщений: 5,489
15.01.2012, 22:52  [ТС] #42
Нет не то же самое. Откинем словоблудие в сторону и начнём с простых конкретных вопросов. Скажи мне, дружок, какая тебе польза будет от идентификатора потока, который корректен только в пределах одного приложения? (идентификатор корректен, конечно).
...Заметь, я на подобный вопрос, отвечал в этой теме уже два раза.
0
retmas
Жарю без масла
864 / 746 / 168
Регистрация: 13.01.2012
Сообщений: 1,702
15.01.2012, 23:11 #43
чтобы не возникали подобные вопросы изучи ка лучше posix threads получше, дружок. и если вдруг удосужишься на этот подвиг, то поймешь что в модели потоков posix не рассматривается возможность передачи ид потока одного процесса другому процессу.
а если ты настаиваешь на такой передаче, то причем тут pthreads(и ее конкретная реализация)?
0
kravam
быдлокодер
1703 / 890 / 45
Регистрация: 04.06.2008
Сообщений: 5,489
15.01.2012, 23:13  [ТС] #44
слив засчитан
0
silent_1991
Эксперт С++
4989 / 3046 / 149
Регистрация: 11.11.2009
Сообщений: 7,028
Завершенные тесты: 1
15.01.2012, 23:18 #45
Цитата Сообщение от kravam Посмотреть сообщение
слив засчитан
Ваш - да.
0
15.01.2012, 23:18
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
15.01.2012, 23:18
Привет! Вот еще темы с ответами:

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

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

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

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


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

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

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