Как найти pid для pthread ?

Модератор: Модераторы разделов

varuba
Сообщения: 2
ОС: Fedora Core

Как найти pid для pthread ?

Сообщение varuba »

Задача простая. Для повышения скорости вычислений на SMP-машине для программы с потоками хочу привязать потоки к разным процессорам. Для этог имеется вызов sched_setaffinity(). Этому вызову нужен pid процесса. Если создаю потоки с помощью clone(), то возвращается pid и привязка работает (и имею заметное ускоренее). Если использую pthread_create(), то возвращается адрес внутренней структуры, а нужен pid. Как его найти? Проблема усугубляется тем, что если использую pthread_create(), то функция getpid() в потоковой процедуре возвращает pid родителя, а не вновь созданного потока - этого я уже совсем не понимаю. В то же время программа top спокойно отображает все потоки и у каждого из них свой pid. Может кто чего посоветует? Заранее благодарен.
Спасибо сказали:
mikluxo
Сообщения: 283
ОС: Slackware 12.2

Re: Как найти pid для pthread ?

Сообщение mikluxo »

Насколько я знаю, posix threads разделяют один pid. Т.е. kernel(точнее планировщик) знает о pid процесса, но не о pid thread.
Для разделения по pid используется fork() и exec.
Сейчас в гугле откопал, что есть еще linuxThreads, которые разделяют для каждого thread'а отдельный pid.
Смотрите здесь:
http://linux.die.net/man/7/pthreads
http://pauillac.inria.fr/~xleroy/linuxthreads/
http://pauillac.inria.fr/~xleroy/linuxthreads/faq.html

Авось пригодится.
Ich weiss, dass ich nichts weiss, aber wissen Sie es auch?
Завистники на что не взглянут,
подымут вечно лай,
А ты себе своей дорогою ступай,
Полают, да отстанут. Крылов
Спасибо сказали:
Аватара пользователя
Portnov
Модератор
Сообщения: 1786
Статус: Матёрый линуксоид
ОС: Debian testing/unstable

Re: Как найти pid для pthread ?

Сообщение Portnov »

pthreads - это так называемые "облегчённые потоки", выполняемые в пределах одного потока с точки зрения ядра. Преимущество - быстрее создаются (хотя я что-то не уверен, что намного), недостаток - невозможно использовать средства управления потоками, предоставляемые ядром (т.к. ядро об этих потоках вообще не знает).
Работа: Ubuntu 9.10
Дом: Debian testing/unstable и на всякий случай winxp в virtualbox.
Для разнообразия: моя домашняя страница -http://iportnov.ru
Спасибо сказали:
varuba
Сообщения: 2
ОС: Fedora Core

Re: Как найти pid для pthread ?

Сообщение varuba »

Спасибо за ответ. Но не уверен что Вы правы, поскольку во всяком случае в Fedora-10 программа top в режиме отображения потоков показывает у всех потоков разные идентификаторы (в колонке PID=Process Id), а кроме того она показывает что они вычисляются на разных процессорах (если вывести колонку #C=Last used CPU). Быть может, надо использовать gettid() ? У меня он есть в man, но в инклудах и библиотеках его нет, так что я попробовать не могу.
Спасибо сказали:
mikluxo
Сообщения: 283
ОС: Slackware 12.2

Re: Как найти pid для pthread ?

Сообщение mikluxo »

varuba писал(а):
29.01.2009 13:01
Но не уверен что Вы правы, поскольку во всяком случае в Fedora-10 программа top в режиме отображения потоков показывает у всех потоков разные идентификаторы (в колонке PID=Process Id)

Выше пост смотрели, треды разделяются на pthreads и linuxthreads. Смотря какой используется, "чистый" pthread будет иметь 1 pid на все потоки, в linuxthread каждый имеет свой pid.
The LinuxThreads implementation deviates from the POSIX.1 specification in a number of ways, including the following:
-
Calls to getpid(2) return a different value in each thread.
Ich weiss, dass ich nichts weiss, aber wissen Sie es auch?
Завистники на что не взглянут,
подымут вечно лай,
А ты себе своей дорогою ступай,
Полают, да отстанут. Крылов
Спасибо сказали:
Galaxy Master
Сообщения: 142
ОС: Debian GNU/Linux

Re: Как найти pid для pthread ?

Сообщение Galaxy Master »

здесь есть ответ на вопрос топика

еще вот отсюда...

There is no requirement on the implementation that the ID of the created thread be available before the newly created thread starts executing. The calling thread can obtain the ID of the created thread through the return value of the pthread_create() function, and the newly created thread can obtain its ID by a call to pthread_self().
Спасибо сказали: