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

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

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 wie folgt mit syscall() 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 ausgegeben werden.


Wie in anderen Antworten erwähnt, definiert pthreads keine plattformunabhängige Methode zum Abrufen einer integralen Thread-ID.

Auf Linux-Systemen erhalten Sie die Thread-ID folgendermaßen:

#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 möglicherweise einen Nutzen in diesem Ansatz

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.


pthread_self() Die Funktion gibt die Thread-ID des aktuellen Threads an.

pthread_t pthread_self(void);

Die 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 pthread_getthreadid_np() verwenden um eine integrale Kennung 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);

Linux
  1. So beenden Sie einen Thread in einem C-Programm (Beispiel pthread_exit)

  2. So erstellen Sie Threads in Linux (mit einem C-Beispielprogramm)

  3. So erhalten Sie die Verzeichnisgröße in Linux

  4. AVR - So programmieren Sie einen AVR-Chip unter Linux

  5. Wie bekomme ich eine Netzmaske von Bash?

So erhalten Sie Informationen über andere Linux-Benutzer

So erhalten Sie Ihre IP-Adresse unter Linux

Erste Schritte mit Arch Linux

Geniale Möglichkeiten zum Ausführen eines Programms unter Linux

So erhalten Sie eine Liste symbolischer Links unter Linux

Wie man ein C-Programm unter Linux schreibt und ausführt