2015-03-06 5 views
5

Kürzlich habe ich im Buch "Advanced Linux Programming" (http://www.advancedlinuxprogramming.com/alp-folder/alp-ch04-threads.pdf, Kapitel 4.5) gelesen, dass auf GNU/Linux POSIX-Threads als Prozesse implementiert sind und dass es eine Art "Manager-Thread" gibt. was einige Kontrolle funktioniert.GNU/Linux Thread-Implementierung

Wenn ich führen Sie das folgende Beispiel aus diesem Buch:

#include <stdio.h> 
#include <pthread.h> 

void* thread_func(void *arg) 
{ 
    fprintf(stderr, "thread: %d\n", (int)getpid()); 
    while(1); 
    return NULL; 
} 

int main() 
{ 
    fprintf(stderr, "main: %d\n", (int)getpid()); 

    pthread_t thread; 
    pthread_create(&thread, NULL, thread_func, NULL); 

    while(1); 
    return 0; 
} 

ich die gleiche PID für den Haupt-Thread und Kind Thread erhalten haben, während das Buch sagt, dass es anders sein kann & dass es eine andere ist PID, was dem sogenannten "manager thread" entspricht. Ich habe versucht, einige Informationen über diesen "Manager-Thread" zu finden, aber es erweist sich als schwierig.

UPD. Ich habe keine Zweifel über das Verhalten meines Programms, aber es gibt einige Verwirrung über das Verhalten, erklärt auf dem Buch - insbesondere unter welchen Umständen kann es wahr sein?

+1

Der Klon syscall Manpage kann helfen http://linux.die.net/man/2/clone – technosaurus

+2

* Advanced Linux Programming * ist ein sehr gutes Buch, aber es wahrscheinlich früher [ NPTL] (http://en.wikipedia.org/wiki/Native_POSIX_Thread_Library) welches ist das was [glibc] (https://www.gnu.org/software/libc/) verwendet/verwendet. –

+0

Mit Büchern über Technologie, immer wissen, wann das Buch veröffentlicht wurde, in diesem Fall "First Edition, Juni 2001". Die Aussage ist einfach veraltet. –

Antwort

0

einfach die entsprechenden Zeilen aus dem Buch und dem Beispiel von Ihnen geteilt lesen, es ist klar, dass es spezifische Implementierung POSIX threads on GNU/Linux

In GNU/Linux, threads are implemented as processes. 

Daher bezieht, Jedes Mal, wenn Sie anrufen pthread_create zum Erstellen eines neuen Thread erstellt Linux einen neuen Prozess, der diesen Thread ausführt.

So in Beispielcode, wenn Sie pthread_create(&thread, NULL, thread_func, NULL); tun, erstellt die Implementierung einen neuen Prozess, um diesen neu erstellten Thread auszuführen. Dieser Prozess wird eine andere PID haben (was getpid() Anruf anzeigt).

So, jetzt haben Sie bereits 2 Prozess, einen Hauptprozess, der gestartet wird, wenn Sie das Programm und diesen neuen Prozess vom System zur Unterstützung der Thread-Ausführung erstellt.

Und die gleiche Implementierung erstellt auch einen anderen Prozess (der in seiner Implementierung intern ist), der als Manager-Thread bezeichnet wird.Und das erstellt wird, wenn Sie aufrufen pthread_create

3

Ich habe die gleiche PID sowohl für Haupt-Thread und Kind Thread

erhielt

, dass normale und erwartete Verhalten ist. Diese Threads, die Sie erstellt haben, koexistieren im selben Prozess. Daher gibt getpid() die ID für diesen Prozess zurück. Wenn Sie Threads unterscheiden möchten, verwenden Sie pthread_self() (POSIX-kompatibel, aber nicht systemweit einmalig) oder gettid() (Linux-spezifisch).

Intern werden alle Prozesse und Threads in Linux werden von Universal-Objekt verwaltet Aufgabe (und definiert durch task_struct) genannt, und jede Aufgabe hat seine eigene ID ist. Die erste Aufgabe ist jedoch ein Handle-Prozess, der Taskgruppenleiter genannt wird. Und getpid() gibt PID Aufgabengruppenleiter zurück.

Also in Ihrem Fall thread_func() Thread druckt PID ihres Führers, main() Aufgabe und main() Thread Druck PID von selbst.

Ich schlage vor, Sie in Kernel Internals zu tauchen. Es bietet eine bessere Sicht auf solche Dinge - versuchen Sie zum Beispiel Robert Love Buch "Linux Kernel Development". Einige Informationen zu Threads/Prozessen/etc. finden Sie hier: http://www.win.tue.nl/~aeb/linux/lk/lk-10.html

+0

die Frage ist, warum woanders (zum Beispiel auf dem System, in dem Buch beschrieben) dies nicht normales und erwartetes Verhalten sein könnte? Kommt es auf bestimmte Kernel-Implementierungen an? – ars

+0

Ich konnte nicht für ein Buch sprechen, aber vielleicht lief das Beispiel auf einer älteren Version von Kernel? Laut 'clone()' wurde in Linux 2.4 die man page threadgroups eingeführt. – myaut

+3

@ars Das Buch ist auf 2001 datiert, so scheint es eine alte Implementierung von Pthreads auf Linux zu beschreiben, [LinuxThreads] (http://en.wikipedia.org/wiki/LinuxThreads) wo dies der Fall war. – nos