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

C++

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

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

27.12.2011, 10:51. Просмотров 8525. Ответов 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
Но хотелось бы всё-таки услышать мнение знающих людей, а то какие ещё сюрпризы меня поджидают?
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
27.12.2011, 10:51     Как получить TID текущего потока? (библиотека pthread, компилятор g++ 4.6.1 открытый вопрос niXmanу)
Посмотрите здесь:
Как узнать, что поток закончился (библиотека pthread)? C++
C++ Linux Приоритет потока (pthread)
библиотека pthread.h в Code::Blocks C++
C++ Pthread функция потока внутри класса
C++ как получить дескриптор файла, открытый функцией fopen
C++ WinAPI HINSTENCE из текущего потока
Как получить имя текущего пользователя Windows? C++ WinAPI
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
retmas
Жарю без масла
859 / 741 / 164
Регистрация: 13.01.2012
Сообщений: 1,694
15.01.2012, 22:38     Как получить TID текущего потока? (библиотека pthread, компилятор g++ 4.6.1 открытый вопрос niXmanу) #41
Цитата Сообщение от kravam Посмотреть сообщение
вопрос из какого значения можно извлечь больше пользы.
не из какого. не имеет смысла. потому, что
Цитата Сообщение от retmas Посмотреть сообщение
это разные ф-ии, которые могут возвращать разные данные.
читай - никак не связанные данные
а если
Цитата Сообщение от kravam Посмотреть сообщение
Ну так-то да
то о какой пользе тут можно говорить?
то же самое, что: "что лучше - круглое или красное".
kravam
быдлокодер
1691 / 878 / 44
Регистрация: 04.06.2008
Сообщений: 5,411
15.01.2012, 22:52  [ТС]     Как получить TID текущего потока? (библиотека pthread, компилятор g++ 4.6.1 открытый вопрос niXmanу) #42
Нет не то же самое. Откинем словоблудие в сторону и начнём с простых конкретных вопросов. Скажи мне, дружок, какая тебе польза будет от идентификатора потока, который корректен только в пределах одного приложения? (идентификатор корректен, конечно).
...Заметь, я на подобный вопрос, отвечал в этой теме уже два раза.
retmas
Жарю без масла
859 / 741 / 164
Регистрация: 13.01.2012
Сообщений: 1,694
15.01.2012, 23:11     Как получить TID текущего потока? (библиотека pthread, компилятор g++ 4.6.1 открытый вопрос niXmanу) #43
чтобы не возникали подобные вопросы изучи ка лучше posix threads получше, дружок. и если вдруг удосужишься на этот подвиг, то поймешь что в модели потоков posix не рассматривается возможность передачи ид потока одного процесса другому процессу.
а если ты настаиваешь на такой передаче, то причем тут pthreads(и ее конкретная реализация)?
kravam
быдлокодер
1691 / 878 / 44
Регистрация: 04.06.2008
Сообщений: 5,411
15.01.2012, 23:13  [ТС]     Как получить TID текущего потока? (библиотека pthread, компилятор g++ 4.6.1 открытый вопрос niXmanу) #44
слив засчитан
silent_1991
Эксперт С++
4958 / 3034 / 149
Регистрация: 11.11.2009
Сообщений: 7,027
Завершенные тесты: 1
15.01.2012, 23:18     Как получить TID текущего потока? (библиотека pthread, компилятор g++ 4.6.1 открытый вопрос niXmanу) #45
Цитата Сообщение от kravam Посмотреть сообщение
слив засчитан
Ваш - да.
kravam
быдлокодер
1691 / 878 / 44
Регистрация: 04.06.2008
Сообщений: 5,411
15.01.2012, 23:28  [ТС]     Как получить TID текущего потока? (библиотека pthread, компилятор g++ 4.6.1 открытый вопрос niXmanу) #46
Да мой-то давно уже засчитан и не один, когда я зарегался ещё.
niXman
Эксперт C++
3134 / 1446 / 49
Регистрация: 09.08.2009
Сообщений: 3,441
Записей в блоге: 2
25.01.2012, 11:06     Как получить TID текущего потока? (библиотека pthread, компилятор g++ 4.6.1 открытый вопрос niXmanу) #47
kravam, для тебя наверное станет жуткой неожиданностью когда ты узнаешь что std::thread::id() возвращает такой же идентификатор
kravam
быдлокодер
1691 / 878 / 44
Регистрация: 04.06.2008
Сообщений: 5,411
25.01.2012, 11:57  [ТС]     Как получить TID текущего потока? (библиотека pthread, компилятор g++ 4.6.1 открытый вопрос niXmanу) #48
Я не могу сказать, почему я это не использую. Може не нашёл, может ещё что. Ну вот если бы ты мне сказал- а оно в твоих сборках есть или нет? И если бы оно там было, тогда я наверное смог бы ответить почему я не использую её. Ибо есть на то причины.
...Сам я щас не смог найти по твоим ссылка упоминание об этом. Потому что я не умею искать.
niXman
Эксперт C++
3134 / 1446 / 49
Регистрация: 09.08.2009
Сообщений: 3,441
Записей в блоге: 2
25.01.2012, 13:27     Как получить TID текущего потока? (библиотека pthread, компилятор g++ 4.6.1 открытый вопрос niXmanу) #49
да ты чё, доку по трэду выгуглить не можешь? оО
вот:
http://www.stdthread.co.uk/doc/heade...ad/thread.html
kravam
быдлокодер
1691 / 878 / 44
Регистрация: 04.06.2008
Сообщений: 5,411
25.01.2012, 14:21  [ТС]     Как получить TID текущего потока? (библиотека pthread, компилятор g++ 4.6.1 открытый вопрос niXmanу) #50
Ну я так и не понял, эта штука есть у тебя или нет. Ну предположим, что есть. А тогда:

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


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

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

Цитата Сообщение от kravam Посмотреть сообщение
И я помню, что на у тебя на сайте есть. Но неполная.
ты про это?
так это не документация. это просто вводная статья.
kravam
быдлокодер
1691 / 878 / 44
Регистрация: 04.06.2008
Сообщений: 5,411
25.01.2012, 16:08  [ТС]     Как получить TID текущего потока? (библиотека pthread, компилятор g++ 4.6.1 открытый вопрос niXmanу) #52
НУ я не знаю как это правильно назвать:
std::thread

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

Где-то здесь. Щас я искал но не смог найти. Ну раз она мне показалась неполной, решил поикать что-нибудь другое.
niXman
Эксперт C++
3134 / 1446 / 49
Регистрация: 09.08.2009
Сообщений: 3,441
Записей в блоге: 2
25.01.2012, 16:40     Как получить TID текущего потока? (библиотека pthread, компилятор g++ 4.6.1 открытый вопрос niXmanу) #53
Цитата Сообщение от kravam Посмотреть сообщение
И да, документацию по ней я видел у тебя на сайте:
http://code.google.com/p/mingw-builds/downloads/list
там ее никогда не было. увидеть ты ее мог тут.
kravam
быдлокодер
1691 / 878 / 44
Регистрация: 04.06.2008
Сообщений: 5,411
25.01.2012, 16:48  [ТС]     Как получить TID текущего потока? (библиотека pthread, компилятор g++ 4.6.1 открытый вопрос niXmanу) #54
Ну короче факт остаётся фактом, я её у тебя но не нашёл и принялся искать другой инструмент.
kravam
быдлокодер
1691 / 878 / 44
Регистрация: 04.06.2008
Сообщений: 5,411
25.09.2014, 22:36  [ТС]     Как получить TID текущего потока? (библиотека pthread, компилятор g++ 4.6.1 открытый вопрос niXmanу) #55
Вынужден признать, что на некотором отрезке времени мне в моих многопоточных программах вполне хватало TIDa, возвращённого pthread_self().
alex_x_x
бжни
2445 / 1650 / 84
Регистрация: 14.05.2009
Сообщений: 7,162
25.09.2014, 23:39     Как получить TID текущего потока? (библиотека pthread, компилятор g++ 4.6.1 открытый вопрос niXmanу) #56
я смотрю некоторые проблемы решаются годами...
kravam, как успехи за прошедшие два года в этом направлении?
kravam
быдлокодер
1691 / 878 / 44
Регистрация: 04.06.2008
Сообщений: 5,411
25.09.2014, 23:44  [ТС]     Как получить TID текущего потока? (библиотека pthread, компилятор g++ 4.6.1 открытый вопрос niXmanу) #57
А что успехи? Корки вот нужны. Закончил первый курс института, осталось ещё два.
xtier
0 / 0 / 0
Регистрация: 21.07.2015
Сообщений: 4
21.07.2015, 01:39     Как получить TID текущего потока? (библиотека pthread, компилятор g++ 4.6.1 открытый вопрос niXmanу) #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)
В линуксе все работает как надо.
Dmitriy_M
1340 / 1221 / 111
Регистрация: 20.03.2009
Сообщений: 4,374
Записей в блоге: 11
21.07.2015, 12:31     Как получить TID текущего потока? (библиотека pthread, компилятор g++ 4.6.1 открытый вопрос niXmanу) #59
xtier, а с какого он должен работать правильно?
Windows не POSIX система.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
21.07.2015, 13:39     Как получить TID текущего потока? (библиотека pthread, компилятор g++ 4.6.1 открытый вопрос niXmanу)
Еще ссылки по теме:
C++ Builder Как получить имя текущего пользователя в Win2000 ?
C++ вытянуть значение HINSTENCE из текущего потока
Как получить адрес текущего окна зная его Хендл C++ WinAPI
Получить открытый текст C++
Компилятор MinGW в NetBeans не видит класс потока (thread) C++

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

Или воспользуйтесь поиском по форуму:
xtier
0 / 0 / 0
Регистрация: 21.07.2015
Сообщений: 4
21.07.2015, 13:39     Как получить TID текущего потока? (библиотека pthread, компилятор g++ 4.6.1 открытый вопрос niXmanу) #60
Dmitriy_M, меня, как и автора, шокировал этот момент. Вроде компилятор запилен под винду, а работа с тредами - это настолько повседневный инструмент в программировании, что даже удивительно, как так можно было сфейлить. Компилятор, Карл!

Я только изучаю C, прочитал статью на хабре про треды. Там пишут, вот должно быть так и так, я запускаю и не могу понять, в чем дело - у меня совсем другое поведение программы, запускаю на макос, и вправду - теперь как надо. Все это разрывает мозг. В чем смысл этой mingw?
Yandex
Объявления
21.07.2015, 13:39     Как получить TID текущего потока? (библиотека pthread, компилятор g++ 4.6.1 открытый вопрос niXmanу)
Ответ Создать тему
Опции темы

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