我在Ubuntu 12.04 LTS服务器x64(3.2内核)上测试了一些代码,我认为它使用了NPTL。
当我运行
$ getconf GNU_LIBPTHREAD_VERSION
我NPTL 2.15
以下是测试代码。我用gcc -g -Wall -pthread
编译它#include <stdio.h>
#include <sys/types.h>
#include <unistd.h>
#include <pthread.h>
void *func1(void *arg)
{
printf("func1:[%d]%lun", getpid(), pthread_self());
for(;;);
return (void *)0;
}
int main(void)
{
printf("main:[%d]%lun", getpid(), pthread_self());
pthread_t tid1;
pthread_create(&tid1, NULL, func1, NULL);
void *tret = NULL;
pthread_join(tid1, &tret);
return 0;
}
当我运行程序时,似乎一切都在预料之中:两个线程具有相同的pid
$ ./a.out
main:[2107]139745753233152
func1:[2107]139745744897792
但是在htop(一个类似于top的工具,你可以通过apt-get获得它)中,我看到如下:两个线程有不同的pid
PID Command
2108 ./a.out
2107 ./a.out
如果我杀死pid 2108,进程将被杀死
$ kill -9 2108
$./a.out
main:[2107]139745753233152
func1:[2107]139745744897792
Killed
如果我通过gdb运行程序,我可以看到LWP
[Thread debugging using libthread_db enabled]
Using host libthread_db library "/lib/x86_64-linux-gnu/libthread_db.so.1".
main:[2183]140737354069760
[New Thread 0x7ffff77fd700 (LWP 2186)]
func1:[2183]140737345738496
我认为NPTL的线程共享一个PID和LWP是LinuxThreads内核2.6之前。以上看来,NPTL仍在使用LWP下。我说的对吗?我想知道关于NTPL和LWP的真相。
谢谢。
两个线程共享一个PID,如第一个示例所示。
htop
显示了标记为PID的字段中的tid(线程id)。