GNU/Linux >> LINUX-Kenntnisse >  >> Linux

Die von pthread_self() zurückgegebene Thread-ID ist nicht dasselbe wie die Kernel-Thread-ID, die von einem Aufruf von gettid(2) zurückgegeben wird.

Auf welcher Grundlage sollte ich also entscheiden, ob ich pthread_self oder orettid verwenden soll, um festzustellen, welcher Thread die Funktion ausführt?

Sie sollten immer pthread_self() verwenden wann immer Sie einen Thread in Ihrer Anwendung identifizieren möchten. gettid() kann sein für bestimmte Zwecke verwendet und wenn Sie wissen, dass es Linux ist. Beispiel:gettid() kann verwendet werden, um Seed für einen Thread-spezifischen Seed zu erhalten (verwendet in srand() ).

Beide sind nicht portabel.

Dies ist nicht ganz richtig. gettid() ist nicht portabel, da es sich um eine Linux-spezifische Funktion handelt. Aber pthread_self() ist übertragbar, solange Sie keine Annahmen über seine Darstellung treffen.

Folgendes ist beispielsweise nicht tragbar.

printf("Thread ID is: %ld", (long) pthread_self());

da es keine Garantie dafür gibt, dass pthread_self() wird eine Art Integer sein. Aber

pthread_t my_tid; //filled elsewhere

pthread_t tid = pthread_self();

if( pthread_equal(my_tid, tid) ) {
   /* do stuff */
}

ist voll portabel.

Ersteres ist nicht portierbar, weil es annimmt diese Thread-ID ist eine Ganzzahl, letztere nicht.

Warum gibt es zwei verschiedene Funktionen, um die Thread-ID zu erhalten?

Sie sind nicht zwei verschiedene Wege, um denselben Wert zu erhalten. Eins (pthread_self() wird von der Thread-Bibliothek (pthreads) bereitgestellt, während die andere (gettid() ist eine betriebssystemspezifische Funktion. Ein anderes Betriebssystem kann eine andere Schnittstelle/einen anderen Systemaufruf bereitstellen, um eine Thread-ID ähnlich wie gettid() zu erhalten . Sie können sich also nicht auf gettid() verlassen in einer portablen Anwendung.


pthread_self() returns the process-wide unique pthread-id.

gettid() gibt die (pthread-implementierungsspezifische) systemweit eindeutige Thread-ID (unter Linux) zurück.

the TID(thread id) returned by gettid() is unique inside a process

Ja.

(or inside a program with multiple processes,

Ja.

inside a process, different thread has different thread id.

Ja.

the TID returned by pthread_self() is unique across processes,

Nein.

different thread has different TID on the same machine at the same time.

Ja im selben Prozess, Nein über die gesamte Maschine.

Da gettid() Linux-spezifisch und daher nicht portierbar ist, besteht die einzige Möglichkeit, einen pthread systemweit zu identifizieren, darin, seine (systemweit eindeutige) übergeordnete Prozess-ID, die von getpid() zurückgegeben wird, zusammen mit seinem (prozessweit eindeutigen) pthread zu verwenden. id wie von pthread_self() zurückgegeben.


Dies ist eine interessante Studie über den Unterschied zwischen konzeptionell Terminologie und echte Softwareeinheiten (die zu bestimmten Software-Abstraktionen gehören).

Achten Sie zunächst auf die Typen dieser beiden Anrufe.

pid_t gettid(void);
pthread_t pthread_self(void);

Einer ist pid_t und der andere ist pthread_t . Beide beziehen sich auf eine gemeinsame konzeptionelle Einheit namens thread , aber die unterschiedlichen Typen implizieren, dass es sich um zwei verschiedene software entities handelt . Sie sind verschiedene Darstellungen eines thread id , und innerhalb der Software-Abstraktion, die sie enthält, sinnvoll ist. Also pthread_t macht nur Sinn innerhalb der von pthread unterstützten Abstraktion Paket und pid_t innerhalb der Abstraktion, die diesen Typ enthält, sinnvoll (d. h. Linux-Systemaufrufe, die sich mit pid_t befassen). ).

Sie sollten je nach Kontext den richtigen Typ verwenden. Verwenden Sie pthread_t im Kontext, der den Typ pthread_t erfordert und pid_t im Kontext, der pid_t erfordert - ungeachtet der Tatsache, dass sie sich möglicherweise auf denselben Thread beziehen.

Jeder dieser Kontexte hat eine vorgeschriebene Syntax für Vergleich und Gleichheit. pid_t können direkt mit dem == verglichen werden Operator, während pthread_t muss durch Aufruf von pthread_equal verglichen werden .

Der Grund für diese doppelte Darstellung / Software-Abstraktionen ist, dass der pthread Bibliothek ist eine portable Thread-Bibliothek, die auf verschiedenen Betriebssystemen implementiert werden kann. Verschiedene Implementierungen des pthread Bibliothek garantiert, dass der thread id Typ ist immer pthread_t . Diese Threads können darunter einem betriebssystemspezifischen thread entity zugeordnet werden dessen Betriebssystemkennung vom Betriebssystem abhängt (z. B. für Linux ist es pid_t; für Windows ist es DWORD ).

Während sich also die zugrunde liegende Implementierung von Betriebssystem zu Betriebssystem unterscheiden kann, wird der Code gegen den pthread geschrieben Abstraktion bleibt über Betriebssysteme hinweg portierbar (solange Sie sich auf pthread beschränken Abstraktion).


Linux
  1. Ist eine Sub-Shell dasselbe wie eine Child-Shell?

  2. Diff Wo Linien meistens gleich, aber außer Betrieb sind?

  3. Wie leite ich stderr und stdout in verschiedene Dateien in derselben Zeile im Skript um?

  4. Sind tar.gz und tgz dasselbe?

  5. Kann die Thread-ID eines Multithread-Prozesses mit der Prozess-ID eines anderen laufenden Prozesses identisch sein?

So führen Sie verschiedene PHP-Versionen auf demselben Server aus

Warum liefert `md5sum` nicht den gleichen Hash wie das Internet?

Verschiedene Linux-Distributionen teilen sich den gleichen /home-Ordner?

Warum wird der Kernel demselben Adressraum wie Prozesse zugeordnet?

Wie kann ich einen anderen Befehl ausführen, aber mit denselben Argumenten?

Docker:Paar-Schnittstellen konnten nicht hinzugefügt werden (Vorgang wird nicht unterstützt)