Как найти pid для pthread ?
Модератор: Модераторы разделов
-
varuba
- Сообщения: 2
- ОС: Fedora Core
Как найти pid для pthread ?
Задача простая. Для повышения скорости вычислений на SMP-машине для программы с потоками хочу привязать потоки к разным процессорам. Для этог имеется вызов sched_setaffinity(). Этому вызову нужен pid процесса. Если создаю потоки с помощью clone(), то возвращается pid и привязка работает (и имею заметное ускоренее). Если использую pthread_create(), то возвращается адрес внутренней структуры, а нужен pid. Как его найти? Проблема усугубляется тем, что если использую pthread_create(), то функция getpid() в потоковой процедуре возвращает pid родителя, а не вновь созданного потока - этого я уже совсем не понимаю. В то же время программа top спокойно отображает все потоки и у каждого из них свой pid. Может кто чего посоветует? Заранее благодарен.
-
mikluxo
- Сообщения: 283
- ОС: Slackware 12.2
Re: Как найти pid для pthread ?
Насколько я знаю, 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
Авось пригодится.
Для разделения по 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 ?
pthreads - это так называемые "облегчённые потоки", выполняемые в пределах одного потока с точки зрения ядра. Преимущество - быстрее создаются (хотя я что-то не уверен, что намного), недостаток - невозможно использовать средства управления потоками, предоставляемые ядром (т.к. ядро об этих потоках вообще не знает).
Работа: Ubuntu 9.10
Дом: Debian testing/unstable и на всякий случай winxp в virtualbox.
Для разнообразия: моя домашняя страница -http://iportnov.ru
Дом: Debian testing/unstable и на всякий случай winxp в virtualbox.
Для разнообразия: моя домашняя страница -http://iportnov.ru
-
varuba
- Сообщения: 2
- ОС: Fedora Core
Re: Как найти pid для pthread ?
Спасибо за ответ. Но не уверен что Вы правы, поскольку во всяком случае в Fedora-10 программа top в режиме отображения потоков показывает у всех потоков разные идентификаторы (в колонке PID=Process Id), а кроме того она показывает что они вычисляются на разных процессорах (если вывести колонку #C=Last used CPU). Быть может, надо использовать gettid() ? У меня он есть в man, но в инклудах и библиотеках его нет, так что я попробовать не могу.
-
mikluxo
- Сообщения: 283
- ОС: Slackware 12.2
Re: Как найти pid для pthread ?
Выше пост смотрели, треды разделяются на 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 ?
здесь есть ответ на вопрос топика
еще вот отсюда...
еще вот отсюда...
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().