Der lokale Thread-Speicher ist statisch, verhält sich jedoch ganz anders als der einfache statische Speicher.
Wenn Sie eine Variable als statisch deklarieren, gibt es genau eine Instanz der Variablen. Das Compiler- / Laufzeitsystem garantiert, dass es irgendwann vor der tatsächlichen Verwendung für Sie initialisiert wird, ohne genau anzugeben, wann (einige Details wurden hier weggelassen).
C ++ 11 garantiert, dass diese Initialisierung threadsicher ist. Vor C ++ 11 wurde diese Thread-Sicherheit jedoch nicht garantiert. Beispielsweise
static X * pointer = new X;
Es können Instanzen von X verloren gehen, wenn mehr als ein Thread gleichzeitig den statischen Initialisierungscode trifft.
Wenn Sie einen Variablenthread lokal deklarieren, gibt es möglicherweise viele Instanzen der Variablen. Sie können sich diese als eine Karte vorstellen, die durch die Thread-ID indiziert wurde. Das bedeutet, dass jeder Thread eine eigene Kopie der Variablen sieht.
Wenn die Variable initialisiert wird, garantiert das Compiler- / Laufzeitsystem erneut, dass diese Initialisierung vor der Verwendung der Daten erfolgt und dass die Initialisierung für jeden Thread erfolgt, der die Variable verwendet. Der Compiler garantiert auch, dass die Initiierung threadsicher ist.
Die Thread-Sicherheitsgarantie bedeutet, dass es hinter den Kulissen eine Menge Code geben kann, damit sich die Variable so verhält, wie Sie es erwarten - insbesondere, wenn man bedenkt, dass der Compiler nicht im Voraus genau wissen kann, wie viele Threads dies tun werden sind in Ihrem Programm vorhanden und wie viele davon berühren die lokale Thread-Variable.
thread_local
lokale Variable zu haben macht zunächst keinen Sinn ... jeder Thread hat seinen eigenen Aufrufstapel.