Zugriff auf thread-lokale aus einem anderen thread
Wie kann ich das Lesen/schreiben einer thread-lokalen variable von einem anderen thread aus? Das ist im Thread, möchte ich den Zugriff auf die variable in Thread B thread local storage-Bereich. Ich weiß die ID von dem anderen thread.
Die variable ist deklariert als __thread
im GCC. Zielplattform ist Linux, aber die Unabhängigkeit wäre schön (GCC-spezifisch ist okay aber).
Fehlt ein thread-start-hook-es gibt keinen Weg, ich kann einfach die Spur dieser Wert am Anfang jedes Threads. Alle threads müssen verfolgt werden, auf diese Weise (nicht nur speziell gestartet sind).
Einer höheren Ebene wrapper wie boost thread_local_storage oder mit Hilfe der pthread-keys ist keine option. Ich verlange, dass die Leistung mit einem wahren __thread
lokale variable.
ERSTE ANTWORT IST FALSCH: Man kann nicht Globale Variablen verwenden für das, was ich tun möchte. Jeder thread muss seine eigene Kopie der Variablen. Außerdem müssen diese Variablen werden __thread
Variablen aus performance-Gründen (eine ebenso effiziente Lösung wäre auch okay, aber ich kenne keine). Ich habe auch keine Kontrolle über die thread-Eintrag Punkte, es gibt also keine Möglichkeit für solche threads zu registrieren jede Art von Struktur.
Thread-Lokalen ist nicht privat: ein Weiteres Missverständnis über thread-lokalen Variablen. Diese sind in keiner Weise irgendeine Art von private variable für den thread. Sie sind Global adressierbaren Speicher, mit der Einschränkung, dass Ihre Lebensdauer ist gebunden an den thread. Jede Funktion, aus jedem thread, wenn da ein Zeiger auf diese Variablen können Sie verändern. Die Frage oben ist im wesentlichen darüber, wie zu bekommen, dass die Zeiger-Adresse.
- Natürlich, die Allgemeine Idee ist, dass Sie es nicht können. 🙂 Warum lassen Sie nicht jeden thread seinen privaten Wert mit einem nicht-lokalen Daten-Struktur?
- vermutlich
__thread
sagt der compiler er verwenden kann, CPU-Register. wenn dem so ist, würde der direkte Zugriff nicht möglich wegen hardware-Einschränkungen. - die einheimischen sind letztendlich auch nur Standorte in den normalen Speicher. Sie können die Adresse und gib ihn auf einen anderen thread zugreifen.
- das ist mein Kommentar über das fehlen eines start-thread Haken. Ich habe nicht die Möglichkeit abzufangen, alle thread erstellen und registrieren Sie die variable. Ebenso kann ich nicht den overhead eines Funktionsaufrufs für jeden lese-Zugriff auf die variable aus dem besitzenden thread.
- Ich wollte auch Fragen eine sehr ähnliche Frage, aber für die Windows-Implementierung von thread local storage. Hast du durch Zufall finden die Antwort/Lösung auf deine Frage?
- Es riecht wie etwas, das umgesetzt werden kann in eine Bibliothek. Die Art der
thread_local
ist ein wrapper um das, was Sie eigentlich wollen, damit Konstruktor und Destruktor können sich registrieren/de-registrieren der thread-Speicher-Adresse der Wert. I. e. anstatt das zu tunthread_local int
Sie tun, etwas entlang der Linien vonthread_local thread_registration<int>
. Ich werde mich wohl mal an etwas zu schreiben wie diese bald.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Wenn Sie möchten, dass die thread-lokalen Variablen, die nicht-thread-lokaler, warum nicht Sie verwenden Sie Globale Variablen statt?
Wichtige Klarstellung!
Ich behaupte nicht, dass Sie verwenden einen einzigen globalen ersetzen Sie eine thread-lokale variable. Ich 'm darauf hindeutet, der mit einem einzigen globalen array oder andere geeignete Ansammlung von Werten ersetzen Sie eine thread-lokale variable.
Haben Sie, um eine Synchronisation natürlich, aber da Sie wollen, dass ein Wert geändert wurde in thread A zu thread B es gibt keinen Weg daran vorbei, dass.
Update:
Den GCC-Dokumentation auf
__thread
sagt:Daher, wenn Sie darauf bestehen, gehen auf diese Weise ich kann mir vorstellen es ist möglich, die Adresse einer thread-lokalen variable aus dem thread es gehört, gerade nach dem thread erzeugt. Sie könnten dann speichern einen Zeiger auf die Speicheradresse zu einer Karte (thread-id => Zeiger), und lassen Sie andere threads Zugriff auf die variable auf diese Weise. Dies setzt Voraus, dass Sie den code für die erzeugte thread.
Wenn Sie wirklich abenteuerlich, Sie könnten versuchen, zu Graben, bis die Informationen auf
___tls_get_addr
(start von dieses PDF, die im Zusammenhang mit der oben genannten GCC-docs). Aber dieser Ansatz ist so hoch, compiler und Plattform spezifisch und so fehlt in der Dokumentation, die es werden sollten, wodurch Alarm ausgelöst werden, in jeden Kopf.___tls_get_addr
ist Ihre einzige Hoffnung.Ich bin auf der Suche für die gleiche Sache.
Wie ich sehe, hat niemand Ihre Frage beantwortet, nachdem er durchsucht das web in allen Arten kam ich zu der nachfolgenden Informationen: angenommen, dass zu kompilieren für den gcc unter linux (ubuntu) und mit -m64, die Segmentregister gs behält den Wert 0. Der verborgene Teil des Segments (halten Sie die lineare Adresse)
Punkte auf den thread-spezifischen lokalen Bereich.
Das Gebiet enthält, an die Adresse die Adresse die Adresse ( 64 bits ). Bei kleineren Adressen sind gespeichert, alle thread-lokalen Variablen.
Diese Adresse ist die
native_handle()
.So, um den Zugriff eines threads auf lokale Daten, sollten Sie es über diesen Zeiger.
In anderen Worten:
(char*)&variable-(char*)myThread.native_handle()+(char*)theOtherThread.native_handle()
Den code, der veranschaulicht, die oben angenommen, dass g++,linux,pthreads ist:
Ich war leider nie in der Lage, einen Weg zu finden, dies zu tun.
Ohne irgendeine Art von thread init-hook-es funktioniert einfach nicht scheinen, um einen Weg an, der Zeiger (kurz ASM hacks, wäre Plattform abhängig).