Wie drucke ich in einem Linux-C-Programm die Thread-ID eines Threads, der von der pthread-Bibliothek erstellt wurde? Zum Beispiel, wie wir von einem Prozess Pid bekommen können getpid()
.
Wie bekomme ich die Thread-ID eines Pthreads im Linux-C-Programm?
Ravi Chandra
Evan Langlois
Was? Die Person fragte nach Linux-spezifisch und dem Äquivalent von getpid(). Nicht BSD oder Apple. Die Antwort ist gettid() und gibt einen ganzzahligen Typ zurück. Sie müssen es mit syscall() wie folgt aufrufen:
#include <sys/types.h>
#include <unistd.h>
#include <sys/syscall.h>
....
pid_t x = syscall(__NR_gettid);
Obwohl dies möglicherweise nicht auf Nicht-Linux-Systeme portierbar ist, ist die Thread-ID direkt vergleichbar und sehr schnell zu erwerben. Sie kann (zB für LOGs) wie eine normale Ganzzahl gedruckt werden.
-
Dies sollte eine wahre Antwort sein
– Matthäus S
21. Januar 2019 um 1:00 Uhr
-
Die Person fragte nach etwas, das unter Linux funktionierte. Dies auf tragbare Weise zu tun, scheint mir der bevorzugte Weg zu sein. Wenn Portabilität keine Rolle spielt, dann wird Linux wahrscheinlich wirklich das neue Windows …
– Jaspis Siepkes
19. Dezember 2019 um 11:26 Uhr
-
@Jasper Siepkes Du verfehlst den Punkt. Er bat um einen LINUX-Aufruf, der das Äquivalent von getpid() für Threads war. Das ist gettid(). Die Frage wurde nicht nach Portabilität oder POSIX gestellt. Zu viele Leute wollen angeben und versuchen zu lehren, anstatt die Frage so zu stellen, wie sie gestellt wurde. pthread_self() gibt die Kernel-Thread-ID nicht zurück und ist nicht auf eine Weise manipulierbar, die ein einfaches Drucken ermöglicht. Außerdem ist pthread_self wahrscheinlich ein Zeiger und sollte nicht manipuliert, sondern nur mit pthread_equal() verglichen werden. Die Frage nach einer ID, die Sie drucken können, und das ist gettid().
– Evan Langlois
20. Dezember 2019 um 12:39 Uhr
-
@EvanLanglois Er arbeitet mit der pthread-Bibliothek, buchstäblich der POSIX-Thread-Bibliothek. Eine POSIX-kompatible Antwort zu machen, ist nicht so seltsam. “Er bat um einen LINUX-Aufruf, der das Äquivalent von getpid() für Threads war.” Nein,
getpid()
wurde als Beispiel angeführt. Es wurde nicht gesagt, dass die Semantik eine harte Spezifikation sei. Die Leute darauf aufmerksam zu machen, Dinge auf eine POSIX-kompatible Weise zu tun, damit andere Gemeinschaften außer Linux (wie FreeBSD, Illumos, OS X usw.) davon profitieren können, ist keine “Angeberei”. Wie ich schon sagte, ich denke, Linux ist wirklich das nächste Windows geworden.– Jaspis Siepkes
30. März 2020 um 16:20 Uhr
-
Können Sie erklären und Ihre Antwort ergänzen, wie und wann man es verwenden muss?
syscall()
und was die__NR_
part kommt von und bedeutet, und wo wir eine Liste möglicher Werte sehen können, an die übergeben werden kannsyscall()
?– Gabriel Staples
22. September 2021 um 21:24 Uhr
Abhitesh khatri
pthread_self()
Die Funktion gibt die Thread-ID des aktuellen Threads an.
pthread_t pthread_self(void);
Das pthread_self()
Die Funktion gibt das Pthread-Handle des aufrufenden Threads zurück. Die Funktion pthread_self() gibt NICHT den integralen Thread des aufrufenden Threads zurück. Sie müssen verwenden pthread_getthreadid_np()
um einen integralen Bezeichner für den Thread zurückzugeben.
HINWEIS:
pthread_id_np_t tid;
tid = pthread_getthreadid_np();
ist wesentlich schneller als diese Aufrufe, bietet aber das gleiche Verhalten.
pthread_id_np_t tid;
pthread_t self;
self = pthread_self();
pthread_getunique_np(&self, &tid);
-
Die ursprüngliche Frage bezog sich auf Linux. Linux enthält die _np-Funktionen nicht. (Es enthält nicht ihre Manpages, ich habe nicht weiter nachgesehen.)
– Trade-Ideen Philip
24. April 2014 um 4:30 Uhr
-
pthread_threadid_np ist unter OS X >= 10.6 und iOS >= 3.2 verfügbar.
– Bläser
1. Dezember 2014 um 21:53 Uhr
-
@Bleater Können Sie bitte die offizielle Dokumentation für bereitstellen
pthread_threadid_np
. Muss ich für ein Projekt verwenden, also muss ich die Zuverlässigkeit dieser API auf iOS- und OSX-Plattformen überprüfen. Verweist auf den Link unter opensource.apple.com/source/Libc/Libc-583/pthreads/pthread.h bin mir aber nicht sicher ob es die richtigen sind.– Vivek Maran
23. Februar 2015 um 14:26 Uhr
-
@Vivek Ich habe keinen Link zu offiziellen Dokumenten, nur den Header, den Sie verlinken, und die Quelle unter opensource.apple.com/source/Libc/Libc-583/pthreads/pthread.c
– Bläser
27. Februar 2015 um 1:17 Uhr
-
@Trade-IdeasPhilip – Zur Verdeutlichung,
_np
bedeutet nicht tragbar. Linux hat seine eigene_np
Zeug, aber es enthält nicht Applespthread_getthreadid_np
.– Josh Kelley
28. Oktober 2015 um 17:18 Uhr
Bläser
Wie in anderen Antworten erwähnt, definiert pthreads keine plattformunabhängige Methode zum Abrufen einer integralen Thread-ID.
Auf Linux-Systemen können Sie die Thread-ID folgendermaßen erhalten:
#include <sys/types.h>
pid_t tid = gettid();
Auf vielen BSD-basierten Plattformen gibt diese Antwort https://stackoverflow.com/a/21206357/316487 einen nicht-portablen Weg.
Wenn Sie jedoch glauben, dass Sie eine Thread-ID benötigen, um zu wissen, ob Sie denselben oder einen anderen Thread als einen anderen von Ihnen kontrollierten Thread ausführen, finden Sie in diesem Ansatz möglicherweise einen Nutzen
static pthread_t threadA;
// On thread A...
threadA = pthread_self();
// On thread B...
pthread_t threadB = pthread_self();
if (pthread_equal(threadA, threadB)) printf("Thread B is same as thread A.\n");
else printf("Thread B is NOT same as thread A.\n");
Wenn Sie nur wissen müssen, ob Sie sich im Hauptthread befinden, gibt es zusätzliche Möglichkeiten, die in den Antworten auf diese Frage dokumentiert sind. Wie kann ich feststellen, ob pthread_self der (erste) Hauptthread im Prozess ist?
pid_t tid = syscall(SYS_gettid);
Linux stellt einen solchen Systemaufruf bereit, damit Sie einen Thread identifizieren können.
Jeff
Sie können verwenden pthread_self()
Der Elternteil erfährt die Thread-ID nach dem pthread_create()
wird erfolgreich ausgeführt, aber während der Ausführung des Threads müssen wir die Funktion verwenden, wenn wir auf die Thread-ID zugreifen möchten pthread_self()
.
Nandan
Diese einzelne Zeile gibt Ihnen pid , jede threadid und spid.
printf("before calling pthread_create getpid: %d getpthread_self: %lu tid:%lu\n",getpid(), pthread_self(), syscall(SYS_gettid));
snr
Ich denke, die Frage ist nicht nur nicht klar, sondern die meisten Menschen sind sich des Unterschieds auch nicht bewusst. Untersuchen Sie den folgenden Spruch,
POSIX-Thread-IDs sind nicht identisch mit den Thread-IDs, die von Linux-spezifisch zurückgegeben werden
gettid()
Systemaufruf. POSIX-Thread-IDs werden von der Threading-Implementierung zugewiesen und verwaltet. Die von zurückgegebene Thread-IDgettid()
ist eine Zahl (ähnlich einer Prozess-ID), die vom Kernel vergeben wird. Obwohl jeder POSIX-Thread eine eindeutige Kernel-Thread-ID in der Linux-NPTL-Threading-Implementierung hat, muss eine Anwendung im Allgemeinen nichts über die Kernel-IDs wissen (und wird nicht portierbar sein, wenn es darauf ankommt, sie zu kennen).Auszug aus: The Linux Programming Interface: A Linux and UNIX System Programming Handbook, Michael Kerrisk
IMHO gibt es nur einen tragbaren Weg, der eine Struktur übergibt, in der eine Variable mit aufsteigenden Zahlen definiert wird, z 1,2,3...
bis pro Thread. Auf diese Weise kann die ID der Threads verfolgt werden. Dennoch, int pthread_equal(tid1, tid2)
Funktion verwendet werden soll.
if (pthread_equal(tid1, tid2)) printf("Thread 2 is same as thread 1.\n");
else printf("Thread 2 is NOT same as thread 1.\n");
-
Das
gettid()
ist eigentlich ein guter vorschlag, danke! Ich musste jedoch der Antwort von Sergey L. hier folgen: stackoverflow.com/a/21280941/2430526– SRG
27. März 2019 um 22:06 Uhr
Siehe auch: Unterschied zwischen __NR_gettid und SYS_gettid und Fehlermeldung im C-Programm “undefinierte Referenz auf gettid”.
– Gabriel Staples
22. September 2021 um 21:34 Uhr