thread_local data ist ein Wert, der von der C++ - Laufzeit initialisiert wird, wobei die Daten aus den Abschnitten ".tdata/.tbss" (unter der Annahme von ELF abi) verwendet werden. Es scheint daher machbar, ein weiteres Paar von Abschnitten hinzuzufügen, die ".tinit"/". Tfini" genannt werden. Dieser Abschnitt könnte Code enthalten, der immer dann ausgeführt wird, wenn untergeordnete Threads gestartet und beendet werden und nachdem der lokale Thread-Speicher eingerichtet wurde (analog zu ".init"/".fini" -Abschnitten, die am Haupt-Thread-Start/Ende ausgeführt werden). Die Konstruktoren und Destruktoren für lokale Objekte, die nicht trivial sind, können dann von den Linkern in diese gruppiert werden.Initialisierung von nicht-trivialen thread_local-Variablen: Warum nur auf Anfrage?
Die Funktionalität von angenommenen ".tfini" Abschnitt wird derzeit von dynamischen Maschinen von "__cxa_thread_atexit" und Freunden (bei beträchtlichen Aufwand) behandelt. Jedoch wird von der Laufzeitumgebung keine dedizierte Instrumentierung für den "automatischen" Thread-Initialisierungscode bereitgestellt: Für alle nicht-trivialen lokalen Thread-Objekte muss der Compiler Schutzvariablen ausgeben, die bei jedem Zugriff überprüft werden.
Die Frage ist also: Wurde der oben skizzierte Ansatz von den Thread-Local-Data-Feature-Architekten ausgewertet? Welche Nachteile wurden festgestellt (abgesehen von Änderungen in der Semantik der Thread-Ausführung, die eindeutig nicht in Stein gemeißelt sind)?
Nur neugierig, war die Antwort hilfreich? – yugr
Nein, war es nicht. – oakad
Ich schlage vor, du stellst dann klärende Fragen. – yugr