我在stackoverflow上得到了答案。它指出,如果我们在 Linux 上运行包含 libc libuClibc-0.9.30.1.so (1) 的程序。基本上旧版本的 libc 然后创建的线程将具有不同的 PID,如下所示
root@OpenWrt:~# ./test
main thread pid is 1151
child thread pid is 1153
我尝试使用包含来自 ubuntu libc6 (2) 的 libc 的 linux 运行该程序,即更新版本的 libc 然后创建的线程将具有与进程相同的 PID。
$ ./test
main thread pid is 2609
child thread pid is 2609
The libc (1) use linuxthreads implementation of pthread
而libc(2)使用NPTL
("Native posix thread library")实现pthread
根据linuxthreads
常见问题解答(在 J.3 答案中):
每个线程实际上是一个具有不同 PID 的不同进程,发送到线程 PID 的信号只能由该线程处理
所以在旧libc
的使用linuxthreads
实现中,每个线程都有其不同的 PID
在使用NPTL
实现的新 libc 版本中,所有线程都具有相同的主进程 PID。
由NPTL
redhat团队开发。并且根据redhat NPTL文档:NPTL实现中解决的问题之一是:
(Chapter: Problems with the Existing Implementation, page5)
Each thread having a different process ID causes compatibility problems with other POSIX thread implementations. This is in part a moot point since signals can't be used very well but is still noticeable
这解释了这个问题。
我正在使用包含NPTL
pthread (“本机 posix 线程库”)实现的新 libc 版本。