Wie erhalte ich eine Thread-ID von einem beliebigen pthread_t?

Lesezeit: 4 Minuten

Skruds Benutzeravatar
Skrud

Ich habe ein pthread_t und möchte seine CPU-Affinität ändern. Das Problem ist, dass ich glibc 2.3.2 verwende, das nicht vorhanden ist pthread_setaffinity_np(). Das ist aber in Ordnung, weil pthread_setaffinity_np() selbst ein Wrapper von ist sched_setaffinity()die aufgerufen werden kann, indem eine Thread-ID anstelle einer Prozess-ID übergeben wird, um die Affinität für einen beliebigen Thread festzulegen.

ABER … Die Thread-ID, mit der sched_setaffinity arbeiten kann, ist eine OS-Thread-ID, die Art, die Sie von erhalten können gettid() Systemaufruf. Dies unterscheidet sich vom undurchsichtigen Typ pthread_tund gettid() gibt nur die Thread-ID der zurück aktueller Faden. Ich muss in der Lage sein, die CPU-Affinität eines beliebigen Threads festzulegen.

Leider kann ich nicht auf die privaten Teile des pthreads zugreifen, wodurch ich die Thread-ID stehlen könnte, indem ich ein pthread_t in a umwandele struct pthread *. Umso besser, denke ich, da das Verlassen auf private Implementierungen sogar verlangt mehr Problem.

Ich habe mich auch schon eingelesen pthread_getunique_np Funktion, dies gibt jedoch eine “eindeutige integrale Kennung” zurück – die meiner Meinung nach in keiner Weise einer OS-Thread-ID entspricht.

Daher die Frage: Wie bekomme ich eine Thread-ID von einem beliebigen pthread_t?

Benutzeravatar von Tom Alsberg
Tom Alsberg

Seit pthreads müssen nicht mit Linux-Threads (oder überhaupt Kernel-Threads) implementiert werden, und einige Implementierungen sind vollständig auf Benutzerebene oder gemischt, die pthreads-Schnittstelle bietet keine Funktionen für den Zugriff auf diese Implementierungsdetails, da diese nicht portierbar wären (sogar nicht über pthreads-Implementierungen unter Linux). Thread-Bibliotheken, die diese verwenden, könnten dies als Erweiterung bereitstellen, aber es scheint keine zu geben, die dies tun.

Abgesehen vom Zugriff auf interne Datenstrukturen der Threading-Bibliothek (was Sie verständlicherweise nicht wollen, obwohl Ihr Code mit Ihren Annahmen über Prozessoraffinität und Linux-Thread-IDs ohnehin nicht portierbar sein wird), können Sie möglicherweise bei der Erstellung einen Trick spielen , wenn Sie den Code steuern, der die Threads erstellt:

Geben pthread_create() eine Eingabefunktion, die aufruft gettid() (was Sie übrigens wahrscheinlich mit dem tun müssen syscall Makro direkt, weil es nicht immer von exportiert wird libc), speichert das Ergebnis irgendwo und ruft dann die ursprüngliche Eingabefunktion auf. Wenn Sie mehrere Threads mit derselben Einstiegsfunktion haben, können Sie einen inkrementierten Zeiger an ein Array im übergeben arg Argument zu pthread_createdie dann an die von Ihnen erstellte Eintragsfunktion zum Speichern der Thread-ID übergeben wird. Speichern Sie die pthread_t Rückgabewert von pthread_create in der gleichen Reihenfolge, und dann können Sie die Linux-Thread-IDs aller von Ihnen erstellten Threads anhand ihrer nachschlagen pthread_t Wert.

Ob sich dieser Trick lohnt, hängt davon ab, wie wichtig die Einstellung der CPU-Affinität in Ihrem Fall ist, im Gegensatz zum Nichtzugriff auf interne Strukturen der Thread-Bibliothek oder abhängig von einer bereitgestellten Thread-Bibliothek pthread_setaffinity_np.

Benutzeravatar von jayadev
jayadev

Eigentlich pthread_self kehrt zurück pthread_t und keine ganzzahlige Thread-ID, mit der Sie arbeiten können, die folgende Hilfsfunktion wird Ihnen dies auf portierbare Weise über verschiedene POSIX-Systeme hinweg ermöglichen.

uint64_t gettid() {
    pthread_t ptid = pthread_self();
    uint64_t threadId = 0;
    memcpy(&threadId, &ptid, std::min(sizeof(threadId), sizeof(ptid)));
    return threadId;
}

  • pthread_t tid = pthread_self(); funktioniert auf dem Hauptthread, aber nicht auf einem anderen? Ich habe meine Exe zum Absturz gebracht, wenn ich das abrufe __start_routine nach Anruf pthread_create.

    – Erich

    15. August 2017 um 0:09 Uhr

pthread_t pthread_self()

Diese Rückgabe des aktuellen pthread_t, der Thread-ID, kann in den Typ “unsigned int” konvertiert werden.

  • Eigentlich unsigned long int.

    – Immer springen

    23. Januar 2017 um 17:36 Uhr

  • pthread_self gibt so etwas wie die Adresse der internen Struktur zurück, die von pthreads verwendet wird. Dies ist keine vom Betriebssystem zugewiesene Thread-ID, die vom Systemaufruf gettid() zurückgegeben wird.

    – ivan.ukr

    29. August 2018 um 15:30 Uhr

Benutzeravatar von Giuseppe Corbelli
Giuseppe Corbelli

Im glibc 2.24 das pthread_t zurückgegeben ist nur der Zeiger auf eine undurchsichtige struct pthread. Sie können die Definition in nachschlagen nptl/descr.h.

Benutzeravatar von Kamil Zadora
Kamil Zadora

Ich würde eine einfache Problemumgehung mit einem gemeinsam genutzten int-Array vorschlagen, in das Sie die Thread-ID aus den Threads schreiben könnten, um später darauf zuzugreifen.

Ich hoffe, das hilft.

  • mmap ist nicht erforderlich, Threads teilen sich sowieso denselben Speicher.

    – Raimue

    17. Februar 2009 um 23:58 Uhr

  • mmap ist nicht erforderlich, Threads teilen sich sowieso denselben Speicher.

    – Raimue

    17. Februar 2009 um 23:58 Uhr

1403070cookie-checkWie erhalte ich eine Thread-ID von einem beliebigen pthread_t?

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

Privacy policy