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
时创建的
最近,我在 "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