0

我在 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]%lu\n", getpid(), pthread_self());
    for(;;);
    return (void *)0;
}

int main(void)
{
    printf("main:[%d]%lu\n", 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 用于内核 2.6 之前的 LinuxThreads。上面好像NPTL下还在用LWP。我对吗?我想知道 NTPL 和 LWP 的真相。

谢谢。

4

1 回答 1

0

如您的第一个示例所示,这两个线程确实共享一个 PID。

htop在标记为 PID 的字段中向您显示 TID(线程 ID)。

于 2013-06-19T03:22:43.813 回答