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

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


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

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

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

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

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

Я только изучаю C, прочитал статью на хабре про треды. Там пишут, вот должно быть так и так, я запускаю и не могу понять, в чем дело - у меня совсем другое поведение программы, запускаю на макос, и вправду - теперь как надо. Все это разрывает мозг. В чем смысл этой mingw?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
21.07.2015, 13:39

библиотека 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 Требуется...


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

Или воспользуйтесь поиском по форуму:
60
Ответ Создать тему
Новые блоги и статьи
[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
Когда в детстве ребёнок не получает от родителей чего-то важного, он лишается не просто приятных переживаний, а основы для формирования определённых внутренних качеств и навыков. Если ребёнок не. . .
[golang] Worker Pool
alhaos 09.06.2026
Worker Pool Worker Pool — паттерн конкурентной обработки задач в Go. Суть: фиксированное количество горутин-воркеров читают задачи из общего канала и пишут результаты в общий канал результатов. . . .
[golang] Pipeline
alhaos 08.06.2026
Pipeline Pipeline — паттерн конкурентной обработки данных в Go. Суть: данные проходят через цепочку независимых стадий, каждая из которых работает в своей горутине и общается с соседями через. . .
Свет внутри себя
kumehtar 07.06.2026
Пусть это будет здесь lIs4oanZS9Y
Программа для com-порта
Uhbif79 05.06.2026
Всем привет, давно хотел изучить Qt, начинал, бросал, потом снова начинал. И сейчас вот смог написать свою первую программу. До этого имел опыт программирования микроконтроллеров, писал прошивки на. . .
Транскрипция 55-минутного видео через Whisper: WhisperDesktop облажался, спас Google Colab[
anaschu 01.06.2026
Понадобилось получить текст из свежезагруженного видео на YouTube. Казалось бы, задача на пять минут. Заняла полтора часа. Делюсь опытом — может кому пригодится последовательность решений. . . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru