Я протестировал некоторый код в 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.
Спасибо.
Спасибо за ответ. Значит ли это, что существует доля пространства имен pid? Действительно ли NTPL использует LWP? –
Да, они находятся в том же пространстве имен. PID процесса равен TID начального потока в процессе. – caf
Спасибо за помощь. –