最近,我读过“高级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/Linux
的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()
调用显示的)。
所以,现在你已经有了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