我在高级Linux编程中遇到了一个概念。这是a link:请引用 4.5 GNU/Linux线程实现。
我对作者所说的概念很清楚,但是我对他为打印线程的processID所解释的程序感到困惑。
这是代码
#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;
}
根据作者,上述代码的输出为
% cc thread-pid.c -o thread-pid -lpthread
% ./thread-pid &
[1] 14608
main thread pid is 14608
child thread pid is 14610
我编译时得到的输出是
[1] 3106
main thread pid is 3106
child thread pid is 3106
我知道要创建线程,Linux内部会调用克隆(大多数情况下),就像 fork 系统调用创建进程一样。唯一的区别是在进程中创建的线程共享相同的进程地址空间,而由父进程创建的进程将复制父进程地址空间。因此,我认为在线程中打印进程ID会导致相同的processID。但是,它在书中的结果不一样。
请告诉我他在说什么..?本书/我的答案是错误的吗?
最佳答案
在Linux上,我得到与包含libc libuClibc-0.9.30.1.so
(1)的书相同的结果。
root@OpenWrt:~# ./test
main thread pid is 1151
child thread pid is 1153
并且我尝试使用包含来自ubuntu的libc的linux运行该程序
libc6
(2)$ ./test
main thread pid is 2609
child thread pid is 2609
libc (1)使用
linuxthreads
实现pthread而libc的(2)使用
NPTL
(“本地posix线程库”)执行pthread根据linuxthreads FAQ(在J.3回答中):
因此,在使用
linuxthreads
实现的旧libc中,每个线程都有其不同的PID在使用
NPTL
实现的新libc版本中,所有线程都具有与主进程相同的PID。NPTL
由redhat团队开发。并根据redhat NPTL document:NPTL
实现中解决的问题之一是:这可以解释您的问题。
您正在使用新的libc版本,其中包含pthread的
NPTL
(“本地posix线程库”)实现本书使用了旧版本的libc,其中包含pthread的
linuxthreads
实现关于c - 了解Pthread,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/19676071/