Форум программистов, компьютерный форум, киберфорум
C++
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.71/84: Рейтинг темы: голосов - 84, средняя оценка - 4.71
быдлокодер
1724 / 911 / 106
Регистрация: 04.06.2008
Сообщений: 5,679
1

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

27.12.2011, 10:51. Показов 17233. Ответов 77
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Да, как?
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
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
27.12.2011, 10:51
Ответы с готовыми решениями:

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

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

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

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

77
Жарю без масла
867 / 749 / 225
Регистрация: 13.01.2012
Сообщений: 1,702
15.01.2012, 22:38 41
Author24 — интернет-сервис помощи студентам
Цитата Сообщение от kravam Посмотреть сообщение
вопрос из какого значения можно извлечь больше пользы.
не из какого. не имеет смысла. потому, что
Цитата Сообщение от retmas Посмотреть сообщение
это разные ф-ии, которые могут возвращать разные данные.
читай - никак не связанные данные
а если
Цитата Сообщение от kravam Посмотреть сообщение
Ну так-то да
то о какой пользе тут можно говорить?
то же самое, что: "что лучше - круглое или красное".
0
быдлокодер
1724 / 911 / 106
Регистрация: 04.06.2008
Сообщений: 5,679
15.01.2012, 22:52  [ТС] 42
Нет не то же самое. Откинем словоблудие в сторону и начнём с простых конкретных вопросов. Скажи мне, дружок, какая тебе польза будет от идентификатора потока, который корректен только в пределах одного приложения? (идентификатор корректен, конечно).
...Заметь, я на подобный вопрос, отвечал в этой теме уже два раза.
0
Жарю без масла
867 / 749 / 225
Регистрация: 13.01.2012
Сообщений: 1,702
15.01.2012, 23:11 43
чтобы не возникали подобные вопросы изучи ка лучше posix threads получше, дружок. и если вдруг удосужишься на этот подвиг, то поймешь что в модели потоков posix не рассматривается возможность передачи ид потока одного процесса другому процессу.
а если ты настаиваешь на такой передаче, то причем тут pthreads(и ее конкретная реализация)?
0
быдлокодер
1724 / 911 / 106
Регистрация: 04.06.2008
Сообщений: 5,679
15.01.2012, 23:13  [ТС] 44
слив засчитан
0
Эксперт С++
5055 / 3115 / 271
Регистрация: 11.11.2009
Сообщений: 7,044
15.01.2012, 23:18 45
Цитата Сообщение от kravam Посмотреть сообщение
слив засчитан
Ваш - да.
0
быдлокодер
1724 / 911 / 106
Регистрация: 04.06.2008
Сообщений: 5,679
15.01.2012, 23:28  [ТС] 46
Да мой-то давно уже засчитан и не один, когда я зарегался ещё.
0
Эксперт С++
3211 / 1459 / 74
Регистрация: 09.08.2009
Сообщений: 3,441
Записей в блоге: 2
25.01.2012, 11:06 47
kravam, для тебя наверное станет жуткой неожиданностью когда ты узнаешь что std::thread::id() возвращает такой же идентификатор
0
быдлокодер
1724 / 911 / 106
Регистрация: 04.06.2008
Сообщений: 5,679
25.01.2012, 11:57  [ТС] 48
Я не могу сказать, почему я это не использую. Може не нашёл, может ещё что. Ну вот если бы ты мне сказал- а оно в твоих сборках есть или нет? И если бы оно там было, тогда я наверное смог бы ответить почему я не использую её. Ибо есть на то причины.
...Сам я щас не смог найти по твоим ссылка упоминание об этом. Потому что я не умею искать.
0
Эксперт С++
3211 / 1459 / 74
Регистрация: 09.08.2009
Сообщений: 3,441
Записей в блоге: 2
25.01.2012, 13:27 49
да ты чё, доку по трэду выгуглить не можешь? оО
вот:
http://www.stdthread.co.uk/doc... hread.html
0
быдлокодер
1724 / 911 / 106
Регистрация: 04.06.2008
Сообщений: 5,679
25.01.2012, 14:21  [ТС] 50
Ну я так и не понял, эта штука есть у тебя или нет. Ну предположим, что есть. А тогда:

Я рассуждал так: где можно найти документацию по продукту, как не у разработчиков? Вот я искал у тебя на сайте. И я помню, что на у тебя на сайте есть. Но неполная. И поэтому я решил ей не пользваться. А в гугл я не полез, я подумал, если уж у разрабочиков нет, то нигде нет.
0
Эксперт С++
3211 / 1459 / 74
Регистрация: 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
быдлокодер
1724 / 911 / 106
Регистрация: 04.06.2008
Сообщений: 5,679
25.01.2012, 16:08  [ТС] 52
НУ я не знаю как это правильно назвать:
std::thread

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

Где-то здесь. Щас я искал но не смог найти. Ну раз она мне показалась неполной, решил поикать что-нибудь другое.
0
Эксперт С++
3211 / 1459 / 74
Регистрация: 09.08.2009
Сообщений: 3,441
Записей в блоге: 2
25.01.2012, 16:40 53
Цитата Сообщение от kravam Посмотреть сообщение
И да, документацию по ней я видел у тебя на сайте:
http://code.google.com/p/mingw... loads/list
там ее никогда не было. увидеть ты ее мог тут.
0
быдлокодер
1724 / 911 / 106
Регистрация: 04.06.2008
Сообщений: 5,679
25.01.2012, 16:48  [ТС] 54
Ну короче факт остаётся фактом, я её у тебя но не нашёл и принялся искать другой инструмент.
0
быдлокодер
1724 / 911 / 106
Регистрация: 04.06.2008
Сообщений: 5,679
25.09.2014, 22:36  [ТС] 55
Вынужден признать, что на некотором отрезке времени мне в моих многопоточных программах вполне хватало TIDa, возвращённого pthread_self().
0
бжни
2473 / 1684 / 135
Регистрация: 14.05.2009
Сообщений: 7,162
25.09.2014, 23:39 56
я смотрю некоторые проблемы решаются годами...
kravam, как успехи за прошедшие два года в этом направлении?
0
быдлокодер
1724 / 911 / 106
Регистрация: 04.06.2008
Сообщений: 5,679
25.09.2014, 23:44  [ТС] 57
А что успехи? Корки вот нужны. Закончил первый курс института, осталось ещё два.
0
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
1443 / 1326 / 131
Регистрация: 20.03.2009
Сообщений: 4,689
Записей в блоге: 11
21.07.2015, 12:31 59
xtier, а с какого он должен работать правильно?
Windows не POSIX система.
0
0 / 0 / 0
Регистрация: 21.07.2015
Сообщений: 4
21.07.2015, 13:39 60
Dmitriy_M, меня, как и автора, шокировал этот момент. Вроде компилятор запилен под винду, а работа с тредами - это настолько повседневный инструмент в программировании, что даже удивительно, как так можно было сфейлить. Компилятор, Карл!

Я только изучаю C, прочитал статью на хабре про треды. Там пишут, вот должно быть так и так, я запускаю и не могу понять, в чем дело - у меня совсем другое поведение программы, запускаю на макос, и вправду - теперь как надо. Все это разрывает мозг. В чем смысл этой mingw?
0
21.07.2015, 13:39
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
21.07.2015, 13:39
Помогаю со студенческими работами здесь

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

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

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

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

как получить дескриптор файла, открытый функцией fopen
как получить дескриптор файла, открытый функцией fopen

Как можно программно открыть ссылку и получить в окне броузера открытый файл?
Добрый день! Как можно программно открыть ссылку и получить в окне броузера открытый файл? ...


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

Или воспользуйтесь поиском по форуму:
60
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru