LINUX.ORG.RU

Реализация pthread в linux


0

0

Всем привет. Читаю книгу "Advanced Linux Programming" (http://www.advancedlinuxprogramming.com/alp-folder)

В ней в конце четвертой части описывается реализация потоков в linux: "GNU/Linux Thread Implementation". Написано что потоки в linux реализованы как процессы. И приведена программа, которая печатает getpid() из функции main() и из порожденного ей потока:

#include <pthread.h>
#include <stdio.h>
#include <unistd.h>
void* thread_function (void* arg)
{
  fprintf (stderr, &#8220;child thread pid is %d\n&#8221;, (int) getpid ());
  /* Spin forever. */
  while (1);
  return NULL;
}
int main ()
{
  pthread_t thread;
  fprintf (stderr, &#8220;main thread pid is %d\n&#8221;, (int) getpid ());
  pthread_create (&thread, NULL, &thread_function, NULL);
  /* Spin forever. */
  while (1);
  return 0;
}

В примере вывод этой программы - два разных PID'а, а у меня почемуто она выводит один и тотже PID:

kit@kit ~/src/tmp $ ./thread-pid
main thread pid is 10639
child thread pid is 10639

Также там показано что 'ps x' должна показать три процесса, и что типа один процесс - это поток выполняющий функцию main(), второй - это так называемый manager thread, а третий - это порожденный поток, но у меня 'ps x' показывает только один процесс:

kit@kit ~/src/tmp $ ps x | grep thread-pid
10639 pts/4    Rl    15:30 ./thread-pid

Однако ps -efL показывает два процесса с одинаковым PID, но с разными LWP:

kit@kit ~/src/tmp $ ps -efL | grep thread-pid
kit      10639 23896 10639 95    2 09:58 pts/4    00:08:08 ./thread-pid
kit      10639 23896 10640 95    2 09:58 pts/4    00:08:09 ./thread-pid

В связи с этом возникло два вопроса:
1. Реализация потоков обновленна с момента написания этой книги?
2. что такое LWP в выводе 'ps -efL'?

&#8220; = "

#include <pthread.h>
#include <stdio.h>
#include <unistd.h>
void* thread_function (void* arg)
{
  fprintf (stderr, "child thread pid is %d\n", (int) getpid ());
  /* Spin forever. */
  while (1);
  return NULL;
}
int main ()
{
  pthread_t thread;
  fprintf (stderr, "main thread pid is %d\n", (int) getpid ());
  pthread_create (&thread, NULL, &thread_function, NULL);
  /* Spin forever. */
  while (1);
  return 0;
}

apollonx
() автор топика

1. То что указано в книжке справедливо для реализации потоков которая
так и называется "Linux Threads". Сейчас в основном используется
реализация Native POSIX Thread LIbrary (NPTL). В ней все потоки имеют один PID.
2. LWP - это идентификатор потока (man ps) возвращаемый функцией
pthread_create() или pthread_self().

romanSA
()

Уже больше не так.

eXOR ★★★★★
()

Всем спасибо, разобрался.

apollonx
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.