Pthreads verstehen

8

Ich stieß auf ein Konzept in Advanced Linux Programming . Hier ist ein Link : siehe 4.5 GNU / Linux Thread-Implementierung .

Ich bin klar mit dem Konzept, was der Autor sagt, aber ich bin verwirrt mit dem Programm, das er zum Drucken von Prozess-IDs für Threads erklärt hat.

Hier ist der Code

%Vor%

Die Ausgabe für den obigen Code laut Autor ist

%Vor%

Die Ausgabe, die ich beim Kompilieren bekomme, ist

%Vor%

Ich verstehe, dass Linux intern einen Klon (die meisten Fälle) aufruft, um einen Thread zu erstellen, genau wie der fork Systemaufruf, um einen Prozess zu erstellen. Der einzige Unterschied besteht darin, dass Thread, der in Prozess erstellt wird, denselben Prozessadressraum teilt, während Prozess, der von einem übergeordneten Prozess erstellt wird, den Adressraum des übergeordneten Prozesses kopiert. Also, was ich denke, Druckprozess-ID in Threads führt zu der gleichen Prozess-ID. aber, es ist nicht das gleiche Ergebnis im Buch.

Bitte sagen Sie mir, wovon er redet ..? Ist die Antwort falsch in meinem Buch / meiner ..?

    
Raju Kundhe 30.10.2013, 07:17
quelle

4 Antworten

8

Ich bekomme die gleichen Ergebnisse des Buchs mit Linux, das die libc libuClibc-0.9.30.1.so (1) enthält.

%Vor%

und ich habe versucht, dieses Programm mit einem Linux auszuführen, das die libc von ubuntu libc6 (2)

enthält %Vor%

Die libc (1) verwendet linuxthreads Implementierung von pthread

Und die libc (2) verwenden NPTL ("Native posix thread library") Implementierung von pthread

Nach den linutxthreads FAQ (in J.3 antworten):

  

jeder Thread ist wirklich ein eigener Prozess mit einer eindeutigen PID, und   Signale, die an die PID eines Threads gesendet werden, können nur von diesem Thread behandelt werden

In der alten libc, die linuxthreads implementation verwendet, hat jeder Thread seine eigene PID

In der neuen libc-Version, die NPTL implementation verwendet, haben alle Threads die gleiche PID des Hauptprozesses.

Das NPTL wurde vom Redhat-Team entwickelt. und nach dem redhat NPTL-Dokument : Eines der Probleme, die in der NPTL -Implementierung gelöst werden, ist :

  

(Kapitel: Probleme mit der vorhandenen Implementierung, Seite5)

     

Jeder Thread mit einer anderen Prozess-ID verursacht Kompatibilität   Probleme mit anderen POSIX-Thread-Implementierungen. Dies ist teilweise ein   strittiger Punkt, da Signale nicht sehr gut benutzt werden können, aber still sind   auffällig

Und das erklärt dein Problem.

Sie verwenden die neue libc-Version, die die NPTL ("Native posix thread library") Implementierung von pthread

enthält

Und das Buch verwendet eine alte Version von libc, die linuxthreads Implementierung von pthread enthält

    
MOHAMED 30.10.2013, 08:28
quelle
6

Der Text, von dem Sie arbeiten, ist sehr alt (2001). Ältere Versionen von Linux haben Threads als separate Prozesse mit einem gemeinsamen Adressraum implementiert. Jeder Thread hatte eine separate PID. Dieses Thread-Modell war jedoch nicht POSIX-konform und hatte eine Reihe von Portabilitätsproblemen.

Ab etwa 2.6 wechselte Linux zur "Nativen POSIX Thread Library" (NPTL). In dieser Implementierung erhalten Threads keine eigenen PIDs.

    
Michael Burr 30.10.2013 07:45
quelle
2

Alle von einem Prozess erstellten Threads gehören zu diesem one -Prozess per Definition. Um diese one Prozess-ID zu erhalten, verwenden Sie getpid() , egal von welchem ​​der Prozess 'Threads.

Der Autor des verlinkten Dokuments ist korrekt, das unter Linux (p) threads werden als separate Prozesse implementiert, die denselben Adressraum wie der one -Prozess haben, zu dem sie gehören. Letzteres ist jedoch nicht reflektiert durch getpid() , der Autor des verknüpften Dokuments stimmt nicht mit dieser Annahme überein.

Um die Prozess-ID des einzelnen Prozesses zu erhalten, der für einen einzelnen Thread erstellt wurde, verwenden Sie (den Linux-spezifischen) gettid() * 1 .

* 1: Bitte beachten Sie, dass der glibc keinen Wrapper für diesen Funktionsaufruf bereitstellt. Verwenden Sie syscall() , um es aufzurufen.

    
alk 30.10.2013 07:25
quelle
-2

In linux sind Threads, wie der Autor darauf hingewiesen hat, leichtgewichtige Prozesse, die denselben Adressraum teilen. Jeder Prozess hat eine eindeutige PID, während jeder Thread eine Thread-ID TID hat. Die Thread-ID des Hauptthreads dient als Prozess-ID auch einem doppelten Zweck. Um die threadID des aufrufenden Threads zu erhalten, können Sie die Funktion pthread_self() verwenden.

    
jester 30.10.2013 07:31
quelle

Tags und Links