Wie kann man in Linux-C-Programm die Thread-ID eines Threads drucken, der von der pthread-Bibliothek erstellt wurde?
Beispiel: Wir können PID eines Prozesses durch getpid()
erhalten.
Die Funktion pthread_self()
gibt die Thread-ID des aktuellen Threads an.
pthread_t pthread_self(void);
Die Funktion pthread_self()
gibt das Pthread-Handle des aufrufenden Threads zurück. Die Funktion pthread_self () gibt NICHT den integrierten Thread des aufrufenden Threads zurück. Sie müssen pthread_getthreadid_np()
verwenden, 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 jedoch dasselbe Verhalten.
pthread_id_np_t tid;
pthread_t self;
self = pthread_self();
pthread_getunique_np(&self, &tid);
Was? Die Person fragte nach Linux-spezifischem und dem Äquivalent von getpid (). Nicht BSD oder Apple. Die Antwort lautet gettid () und gibt einen ganzzahligen Typ zurück. Sie müssen es mit syscall () aufrufen, wie folgt:
#include <sys/types.h>
#include <sys/syscall.h>
....
pid_t x = syscall(__NR_gettid);
Dies ist zwar möglicherweise nicht für Nicht-Linux-Systeme portierbar, die Thread-ID ist jedoch direkt vergleichbar und sehr schnell zu erfassen. Es kann (wie bei LOGs) wie eine normale Ganzzahl gedruckt werden.
Sie können pthread_self()
verwenden.
Nachdem die pthread_create()
erfolgreich ausgeführt wurde, lernt das übergeordnete Element die Thread-ID kennen. Wenn Sie jedoch den Thread ausführen, müssen wir die Funktion pthread_self()
verwenden, wenn Sie auf die Thread-ID zugreifen möchten.
Wie bereits in anderen Antworten erwähnt, definiert pthreads keine plattformunabhängige Methode zum Abrufen einer integrierten 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 bietet diese Antwort https://stackoverflow.com/a/21206357/316487 einen nicht portablen Weg.
Wenn Sie jedoch der Meinung sind, dass Sie eine Thread-ID benötigen, ist es zu wissen, ob Sie denselben oder einen anderen Thread als einen anderen Thread verwenden, den Sie steuern, und möglicherweise finden Sie in diesem Ansatz ein Hilfsprogramm
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 Haupt-Thread befinden, gibt es zusätzliche Möglichkeiten, die in Antworten auf diese Frage dokumentiert sind. Wie kann ich feststellen, ob pthread_self der Haupt- (erste) Thread im Prozess ist? .
pid_t tid = syscall(SYS_gettid);
Linux bietet einen solchen Systemaufruf, um die ID eines Threads zu erhalten.
pthread_getthreadid_np
war nicht auf meinem Mac os x. pthread_t
ist ein undurchsichtiger Typ. Schlage nicht deinen Kopf darüber. Weisen Sie es einfach void*
zu und nennen Sie es gut. Wenn Sie printf
benötigen, verwenden Sie %p
.
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));
Es gibt auch eine andere Möglichkeit, die Thread-ID abzurufen. Beim Erstellen von Threads mit
int pthread_create(pthread_t * thread, const pthread_attr_t * attr, void * (*start_routine)(void *), void *arg);
funktionsaufruf; Der erste Parameter pthread_t * thread
ist eigentlich eine Thread-ID (dh ein vorzeichenloser langer Int, der in bits/pthreadtypes.h definiert ist). Das letzte Argument void *arg
Ist auch das Argument, das an die Funktion void * (*start_routine)
übergeben wird, um einen Thread zu erstellen.
Sie können eine Struktur erstellen, um mehrere Argumente zu übergeben und einen Zeiger auf eine Struktur zu senden.
typedef struct thread_info {
pthread_t thread;
//...
} thread_info;
//...
tinfo = malloc(sizeof(thread_info) * NUMBER_OF_THREADS);
//...
pthread_create (&tinfo[i].thread, NULL, handler, (void*)&tinfo[i]);
//...
void *handler(void *targs) {
thread_info *tinfo = targs;
// here you get the thread id with tinfo->thread
}
Plattformunabhängig (ab C++ 11):
#include <thread>
std::this_thread::get_id();
Ich denke nicht nur, dass die Frage nicht klar ist, sondern die meisten Leute erkennen den Unterschied nicht. Untersuche den folgenden Spruch:
POSIX-Thread-IDs stimmen nicht mit den Thread-IDs überein, die von .__ zurückgegeben werden. Linux-spezifischer
gettid()
Systemaufruf. POSIX-Thread-IDs werden .__ zugewiesen. und von der Threading-Implementierung verwaltet. Die Thread-ID wurde zurückgegeben vongettid()
ist eine Zahl (ähnlich einer Prozess-ID), die von .__ zugewiesen wird. der Kernel Obwohl jeder POSIX-Thread eine eindeutige Kernel-Thread-ID hat In der Linux-NPTL-Threading-Implementierung wird eine Anwendung im Allgemeinen muss nicht über die Kernel-IDs Bescheid wissen (und nicht tragbar sein, wenn von deren Kenntnis abhängt).Auszug aus: Die Linux-Programmierschnittstelle: Ein Linux- und UNIX-Programmierhandbuch, Michael Kerrisk
IMHO gibt es nur einen tragbaren Weg, der eine Struktur durchläuft, in der eine variable Anzahl von Nummern aufsteigend definiert wird, z. 1,2,3...
bis pro Thread. Auf diese Weise kann die ID der Threads verfolgt werden. Trotzdem sollte die int pthread_equal(tid1, tid2)
- Funktion verwendet werden.
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");