2013-06-18 8 views
0

Я протестировал некоторый код в Ubuntu 12.04 LTS server x64 (3.2 ядро), который, я думаю, использует NPTL.Почему два потока в NPTL имеют разные pid в Ubuntu12.04

когда я бегу

$ 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; 
} 

, когда я запускаю программу, она, кажется, все следовало ожидать: два потока имеют одинаковый идентификатор

$ ./a.out 
main:[2107]139745753233152 
func1:[2107]139745744897792 

но в Htop (сверху как инструмент, вы можете получить его по меткому-ГЭТ) Я вижу это: две нити имеют разные Pid

PID Command 
2108 ./a.out 
2107 ./a.out 

Если я убью ИДП , процесс будет убит

$ 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.

Спасибо.

ответ

0

В двух потоках имеется один PID, как показано в первом примере.

htop показывает вам идентификаторы TID (Идентификаторы резьбы) в поле, обозначенном как PID.

+0

Спасибо за ответ. Значит ли это, что существует доля пространства имен pid? Действительно ли NTPL использует LWP? –

+0

Да, они находятся в том же пространстве имен. PID процесса равен TID начального потока в процессе. – caf

+0

Спасибо за помощь. –