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).