GNU / Linux线程的实现

最近,我读过“高级Linux编程”一书( http://www.advancedlinuxprogramming.com/alp-folder/alp-ch04-threads.pdf ,第4.5章),在GNU / Linux POSIX线程上实现为进程,并有一些“pipe理线程”,做一些控制工作。

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

#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,它对应于所谓的“pipe理线程”。 我试图find关于这个“经理线程”的一些信息,但是这很困难。

UPD。 对于我的程序的行为我毫不怀疑,但是关于行为的一些混淆,在书中解释 – 特别是在什么情况下可以是真的?

刚刚阅读书中的相关文章和您共享的例子, 很明显它与POSIX threads on GNU/LinuxPOSIX threads on GNU/Linux具体实现有关

 In GNU/Linux, threads are implemented as processes. 

因此,每当你调用pthread_create创建一个新的线程时,Linux会创建一个运行该线程的新进程。

所以在例子代码中,当你做pthread_create(&thread, NULL, thread_func, NULL); 该实现创建一个新的进程来运行这个新创建的线程。 这个过程将有一个不同的PID(这是getpid()调用显示的)。

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

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

我已经收到主线程和子线程相同的PID

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

在内部,Linux中的所有进程和线程都由被称为task的通用对象(由task_struct定义)进行管理,每个任务都有自己的ID。 然而,第一个任务是一个处理过程,因此称为任务组领导getpid()返回该任务组组长的 PID。

所以在你的情况下, thread_func()线程打印它的领导者, main()任务和main()线程的PID自己的PID。

我建议你深入内核内部。 它提供了更清晰的视图 – 例如罗伯特爱书“Linux内核开发”。 有关线程/进程/等的一些信息。 可以在这里找到: http : //www.win.tue.nl/~aeb/linux/lk/lk-10.html