GNU/Linux线程实现

GNU/Linux thread implementation

最近,我在 "Advanced Linux Programming" 书(http://www.advancedlinuxprogramming.com/alp-folder/alp-ch04-threads.pdf,第 4.5 章)中读到 GNU/Linux POSIX 线程是作为进程实现的,并且有某种 "manager thread" 做一些控制工作。

当我 运行 本书中的以下示例时:

#include <stdio.h>
#include <pthread.h>

void* thread_func(void *arg)
{
  fprintf(stderr, "thread: %d\n", (int)getpid());
  while(1);
  return NULL;
}

int main()
{
  fprintf(stderr, "main: %d\n", (int)getpid());

  pthread_t thread;
  pthread_create(&thread, NULL, thread_func, NULL);

  while(1);
  return 0;
}

我主线程和子线程的PID是一样的,书上说可以不一样&还有另外一个PID,对应所谓的"manager thread."我'我试图找到有关此 "manager thread" 的一些信息,但事实证明这很困难。

更新。我对我的程序的行为没有怀疑,但对行为有一些困惑,在书上解释 - 特别是,在什么情况下它可能是真的?

i've received the same PID both for main thread and child thread

这是正常的预期行为。您创建的这些线程共存于同一个进程中,因此该进程的 getpid() returns ID。如果要区分线程,请使用 pthread_self()(POSIX 兼容,但不是系统范围唯一)或 gettid()(Linux 特定)。

在内部,Linux 中的所有进程和线程都由称为 task 的通用对象管理(由 task_struct 定义),每个任务都有它的自己的身份证。然而,第一个任务是一个句柄进程,因此称为任务组组长getpid() returns 任务组组长 的 PID。

因此在您的情况下,thread_func() 线程打印其领导者的 PID,main() 任务,main() 线程打印其自身的 PID。

我建议您深入研究内核内部结构。它提供了对此类事物的更清晰的视图 - 例如尝试 Robert Love book "Linux Kernel Development"。关于 threads/processes/etc 的一些信息。可以在这里找到:http://www.win.tue.nl/~aeb/linux/lk/lk-10.html

看了书上的相关行和你分享的例子,很明显和POSIX threads on GNU/Linux

的具体实现有关
In GNU/Linux, threads are implemented as processes. 

因此,每当您调用 pthread_create 创建一个 新线程,Linux 创建一个 运行 那个线程的新进程。

因此在示例代码中,当您执行 pthread_create(&thread, NULL, thread_func, NULL); 时,实现会为 运行 这个新创建的线程创建一个新进程。这个进程将有一个不同的 PID(这是 getpid()call 显示的)。

所以,现在你已经有了 2 个进程,一个主进程在你 运行 程序时启动,这个新进程由系统创建以支持线程执行。

同样的实现也在创建另一个进程(在其实现内部),称为管理器线程。这是在您调用 pthread_create

时创建的