wake-up-neo.com

wie bekomme ich die Thread-ID eines Pthread in Linux C?

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.

65
Ravi Chandra

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);
65
Abhitesh khatri

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.

47
Evan Langlois

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.

9
Jeff

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

8
bleater
pid_t tid = syscall(SYS_gettid);

Linux bietet einen solchen Systemaufruf, um die ID eines Threads zu erhalten.

7
Weiqi Gu

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

3
user2074102

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));
3
nandan

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
}
2
emre can

Plattformunabhängig (ab C++ 11):

#include <thread>

std::this_thread::get_id();
1
Oleg Oleg

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 von gettid() 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");
0
snr