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

C++

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

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

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

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
kravam
быдлокодер
1695 / 882 / 45
Регистрация: 04.06.2008
Сообщений: 5,459
15.01.2012, 23:28  [ТС] #46
Да мой-то давно уже засчитан и не один, когда я зарегался ещё.
0
niXman
Эксперт C++
3135 / 1447 / 49
Регистрация: 09.08.2009
Сообщений: 3,441
Записей в блоге: 2
25.01.2012, 11:06 #47
kravam, для тебя наверное станет жуткой неожиданностью когда ты узнаешь что std::thread::id() возвращает такой же идентификатор
0
kravam
быдлокодер
1695 / 882 / 45
Регистрация: 04.06.2008
Сообщений: 5,459
25.01.2012, 11:57  [ТС] #48
Я не могу сказать, почему я это не использую. Може не нашёл, может ещё что. Ну вот если бы ты мне сказал- а оно в твоих сборках есть или нет? И если бы оно там было, тогда я наверное смог бы ответить почему я не использую её. Ибо есть на то причины.
...Сам я щас не смог найти по твоим ссылка упоминание об этом. Потому что я не умею искать.
0
niXman
Эксперт C++
3135 / 1447 / 49
Регистрация: 09.08.2009
Сообщений: 3,441
Записей в блоге: 2
25.01.2012, 13:27 #49
да ты чё, доку по трэду выгуглить не можешь? оО
вот:
http://www.stdthread.co.uk/doc/heade...ad/thread.html
0
kravam
быдлокодер
1695 / 882 / 45
Регистрация: 04.06.2008
Сообщений: 5,459
25.01.2012, 14:21  [ТС] #50
Ну я так и не понял, эта штука есть у тебя или нет. Ну предположим, что есть. А тогда:

Я рассуждал так: где можно найти документацию по продукту, как не у разработчиков? Вот я искал у тебя на сайте. И я помню, что на у тебя на сайте есть. Но неполная. И поэтому я решил ей не пользваться. А в гугл я не полез, я подумал, если уж у разрабочиков нет, то нигде нет.
0
niXman
Эксперт C++
3135 / 1447 / 49
Регистрация: 09.08.2009
Сообщений: 3,441
Записей в блоге: 2
25.01.2012, 14:36 #51
kravam, скажи, русский - не родной для тебя язык? ибо повторюсь: я большую часть твоих постов не понимаю.


Цитата Сообщение от kravam Посмотреть сообщение
эта штука есть у тебя или нет
какая "штука" ? std::thread::id ? если да - то почему "у меня"? STL не я пишу.

Цитата Сообщение от kravam Посмотреть сообщение
где можно найти документацию по продукту, как не у разработчиков? Вот я искал у тебя на сайте.
так я не разработчик. я всего лишь выполняю сборки GCC для вендус. разработчики тут: gcc.gnu.org

Цитата Сообщение от kravam Посмотреть сообщение
И я помню, что на у тебя на сайте есть. Но неполная.
ты про это?
так это не документация. это просто вводная статья.
0
kravam
быдлокодер
1695 / 882 / 45
Регистрация: 04.06.2008
Сообщений: 5,459
25.01.2012, 16:08  [ТС] #52
НУ я не знаю как это правильно назвать:
std::thread

То ли это пространство имён, то ли библиотека то ли ещё что. И да, документацию по ней я видел у тебя на сайте:
http://code.google.com/p/mingw-builds/downloads/list

Где-то здесь. Щас я искал но не смог найти. Ну раз она мне показалась неполной, решил поикать что-нибудь другое.
0
niXman
Эксперт C++
3135 / 1447 / 49
Регистрация: 09.08.2009
Сообщений: 3,441
Записей в блоге: 2
25.01.2012, 16:40 #53
Цитата Сообщение от kravam Посмотреть сообщение
И да, документацию по ней я видел у тебя на сайте:
http://code.google.com/p/mingw-builds/downloads/list
там ее никогда не было. увидеть ты ее мог тут.
0
kravam
быдлокодер
1695 / 882 / 45
Регистрация: 04.06.2008
Сообщений: 5,459
25.01.2012, 16:48  [ТС] #54
Ну короче факт остаётся фактом, я её у тебя но не нашёл и принялся искать другой инструмент.
0
kravam
быдлокодер
1695 / 882 / 45
Регистрация: 04.06.2008
Сообщений: 5,459
25.09.2014, 22:36  [ТС] #55
Вынужден признать, что на некотором отрезке времени мне в моих многопоточных программах вполне хватало TIDa, возвращённого pthread_self().
0
alex_x_x
бжни
2447 / 1652 / 84
Регистрация: 14.05.2009
Сообщений: 7,162
25.09.2014, 23:39 #56
я смотрю некоторые проблемы решаются годами...
kravam, как успехи за прошедшие два года в этом направлении?
0
kravam
быдлокодер
1695 / 882 / 45
Регистрация: 04.06.2008
Сообщений: 5,459
25.09.2014, 23:44  [ТС] #57
А что успехи? Корки вот нужны. Закончил первый курс института, осталось ещё два.
0
xtier
0 / 0 / 0
Регистрация: 21.07.2015
Сообщений: 4
21.07.2015, 01:39 #58
Всем привет!
Автор, удалось выяснить в чем проблема?
Я изучаю C и тоже встрял на этом моменте, и теперь хорошо понимаю о чем вы пишите.

В windows этот код работает неправильно, а именно:
pthread_cancel(pthread_self()); - не завершит тред.
pthread_cancel(GetCurrentThreadId()); - тоже не сработает.


ID тредов:
pthread_self() вернет 0,1,2 и тд, т.е порядковые номера
GetCurrentThreadI () вернет нормальные ID, прям как они есть в process explorer'e


Код
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
#include <pthread.h>
#include <unistd.h>
 
#define nil NULL
 
typedef struct {
    size_t progress;
    int errorCode;
} ThreadArg;
 
void drawProgress(void *arg) {
    ThreadArg *argument = arg;
    while(argument->progress < 100) {
        printf("Progress %lu \n", argument->progress);
        sleep(1);
        if(argument->progress == 7) {
            argument->errorCode = -1;
        }
    }
}
void loadData(void *arg) {
    ThreadArg *argument = arg;
    while(argument->progress < 100) {
        ++argument->progress;
        sleep(1);
        if(argument->errorCode == -1) {
            pthread_cancel(pthread_self());
        }
    }
}
int main(int argc, const char *argv[]) {
    pthread_t drawer, loader;
    ThreadArg arg;
    pthread_create(&drawer, nil, (void *(*)(void *)) drawProgress, &arg);
    pthread_create(&loader, nil, (void *(*)(void *)) loadData, &arg);
    pthread_join(loader, nil);
    pthread_join(drawer, nil);
    return 0;
}
Win 8.1, gcc x64
Thread model: posix
gcc version 5.1.0 (x86_64-posix-seh-rev0, Built by MinGW-W64 project)
В линуксе все работает как надо.
0
Dmitriy_M
1349 / 1230 / 114
Регистрация: 20.03.2009
Сообщений: 4,420
Записей в блоге: 11
21.07.2015, 12:31 #59
xtier, а с какого он должен работать правильно?
Windows не POSIX система.
0
xtier
0 / 0 / 0
Регистрация: 21.07.2015
Сообщений: 4
21.07.2015, 13:39 #60
Dmitriy_M, меня, как и автора, шокировал этот момент. Вроде компилятор запилен под винду, а работа с тредами - это настолько повседневный инструмент в программировании, что даже удивительно, как так можно было сфейлить. Компилятор, Карл!

Я только изучаю C, прочитал статью на хабре про треды. Там пишут, вот должно быть так и так, я запускаю и не могу понять, в чем дело - у меня совсем другое поведение программы, запускаю на макос, и вправду - теперь как надо. Все это разрывает мозг. В чем смысл этой mingw?
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
21.07.2015, 13:39
Привет! Вот еще темы с ответами:

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

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

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

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


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

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
21.07.2015, 13:39
Ответ Создать тему
Опции темы

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