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 ..?
Ich bekomme die gleichen Ergebnisse des Buchs mit Linux, das die libc libuClibc-0.9.30.1.so
(1) enthält.
und ich habe versucht, dieses Programm mit einem Linux auszuführen, das die libc von ubuntu libc6
(2)
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
Und das Buch verwendet eine alte Version von libc, die linuxthreads
Implementierung von pthread enthält
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.
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.
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.
Tags und Links c multithreading linux pthreads