Wie drucke ich im Linux C-Programm die Thread-ID eines von der pthread-Bibliothek erstellten Threads?
Zum Beispiel: Wir können einen Prozess durch bekommengetpid()
85
pthread_self()
Die Funktion gibt die Thread-ID des aktuellen Threads an.
pthread_t pthread_self(void);
Die pthread_self()
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 deutlich 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);
pthread_threadid_np
. Ich muss für ein Projekt verwenden, muss also die Zuverlässigkeit dieser API auf iOS- und OSX-Plattformen überprüfen. Verweis auf den Link unter opensource.apple.com/source/Libc/Libc-583/pthreads/pthread.h, aber nicht sicher, ob sie die richtigen sind._np
bedeutet nicht tragbar. Linux hat seine eigenen_np
Sachen, aber keine von Applepthread_getthreadid_np
.Was? Die Person fragte nach Linux-spezifisch 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 () wie folgt aufrufen:
Während dies möglicherweise nicht auf Nicht-Linux-Systeme portierbar ist, ist die Thread-ID direkt vergleichbar und sehr schnell zu erwerben. Es kann wie eine normale Ganzzahl gedruckt werden (z. B. für LOGs).
quelle
getpid()
wurde als Beispiel gegeben. Es wurde nicht gesagt, dass die Semantik eine harte Spezifikation war. Menschen darauf aufmerksam zu machen, Dinge auf POSIX-kompatible Weise zu tun, damit andere Communities außer Linux (wie FreeBSD, Illumos, OS X usw.) davon profitieren können, ist kein "Angeberei". Wie gesagt, ich denke, Linux ist wirklich das nächste Windows geworden.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 abrufen:
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, um zu wissen, ob Sie auf demselben oder einem anderen Thread als einem anderen von Ihnen kontrollierten Thread ausgeführt werden, finden Sie möglicherweise einen Nutzen in diesem Ansatz
Wenn Sie nur wissen müssen, ob Sie sich im Hauptthread befinden, gibt es zusätzliche Möglichkeiten, die in Antworten auf diese Frage dokumentiert sind. Wie kann ich feststellen, ob pthread_self der Hauptthread (der erste) im Prozess ist? .
quelle
Linux bietet einen solchen Systemaufruf an, damit Sie die ID eines Threads erhalten.
quelle
Sie können verwenden
pthread_self()
Das übergeordnete
pthread_create()
Element lernt die Thread-ID kennen, nachdem das erfolgreich ausgeführt wurde. Wenn wir jedoch während der Ausführung des Threads auf die Thread-ID zugreifen möchten, müssen wir die Funktion verwendenpthread_self()
.quelle
Diese einzelne Zeile gibt Ihnen PID, jede Threadid und Spid.
quelle
pthread_getthreadid_np
war nicht auf meinem Mac OS X.pthread_t
ist ein undurchsichtiger Typ. Schlagen Sie nicht Ihren Kopf darüber. Weisen Sievoid*
es einfach zu und nennen Sie es gut. Wenn Sieprintf
verwenden%p
.quelle
Ich denke, nicht nur die Frage ist nicht klar, auch die meisten Menschen sind sich des Unterschieds nicht bewusst. Untersuche das folgende Sprichwort:
IMHO gibt es nur einen tragbaren Weg, der eine Struktur übergibt, in der eine Variable mit aufsteigenden Zahlen definiert wird, z
1,2,3...
. B. pro Thread. Auf diese Weise kann die ID des Threads verfolgt werden. Trotzdem sollte dieint pthread_equal(tid1, tid2)
Funktion verwendet werden.quelle
gettid()
ist eigentlich ein guter Vorschlag, danke! Ich musste jedoch der Antwort von Sergey L. hier folgen: stackoverflow.com/a/21280941/2430526Es 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 tatsächlich eine Thread-ID (dh ein vorzeichenloses langes int, das in bits / pthreadtypes.h definiert ist). Auch das letzte Argumentvoid *arg
ist auch das Argument, das an die zu übergebendevoid * (*start_routine)
Funktion übergeben wird.Sie können eine Struktur erstellen, um mehrere Argumente zu übergeben und einen Zeiger auf eine Struktur zu senden.
quelle
Sie können auch auf diese Weise schreiben und es tut das gleiche. Zum Beispiel:
Dieses Programm erstellt ein Array von pthread_t und berechnet jeweils die Summe. Es wird also die Summe jedes Threads mit der Thread-ID gedruckt.
quelle
Plattformunabhängiger Weg (ab C ++ 11) ist:
quelle
pthread_t
. Auf einem Mac ist das ein Zeiger und unter Linux eine Ganzzahl. Es spiegelt auch nicht die "native" ID wider, die Sie beispielsweise sehen könntentop
. Etwas zu beachten, aber vielleicht ist es für einige Zwecke in Ordnung.