Wie bekomme ich die Thread-ID eines Pthreads im Linux-C-Programm?

Lesezeit: 6 Minuten

Benutzeravatar von Ravi Chandra
Ravi Chandra

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

  • 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

Benutzeravatar von Evan Langlois
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 kann syscall()?

    – Gabriel Staples

    22. September 2021 um 21:24 Uhr


Benutzeravatar von Abhitesh Khatri
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 Apples pthread_getthreadid_np.

    – Josh Kelley

    28. Oktober 2015 um 17:18 Uhr

Benutzeravatar von bleater
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.

Jeffs Benutzeravatar
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().

nandans Benutzeravatar
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));

Benutzeravatar von snr
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-ID gettid() 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


1422560cookie-checkWie bekomme ich die Thread-ID eines Pthreads im Linux-C-Programm?

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy