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 tun thread_local int Sie tun, etwas entlang der Linien von thread_local thread_registration<int>. Ich werde mich wohl mal an etwas zu schreiben wie diese bald.

Schreibe einen Kommentar