L'archiviazione locale del thread è statica ma si comporta in modo abbastanza diverso dalla semplice archiviazione statica.
Quando dichiari una variabile statica, c'è esattamente un'istanza della variabile. Il sistema compilatore / runtime garantisce che verrà inizializzato per te qualche tempo prima di usarlo effettivamente, senza specificare esattamente quando (alcuni dettagli sono omessi qui).
C ++ 11 garantisce che questa inizializzazione sarà thread-safe, tuttavia prima di C ++ 11 questa thread safety non era garantita. Per esempio
static X * pointer = new X;
potrebbe perdere istanze di X se più di un thread ha colpito il codice di inizializzazione statica allo stesso tempo.
Quando si dichiara una variabile thread locale, ci sono potenzialmente molte istanze della variabile. Potresti pensare a loro come se fossero in una mappa indicizzata da thread-id. Ciò significa che ogni thread vede la propria copia della variabile.
Ancora una volta, se la variabile viene inizializzata, il sistema compilatore / runtime garantisce che questa inizializzazione avverrà prima che i dati vengano utilizzati e che avvenga l'inizializzazione per ogni thread che utilizza la variabile. Il compilatore garantisce inoltre che l'avvio sarà thread-safe.
Le garanzie di thread safety significano che ci può essere un bel po 'di codice dietro le quinte per far sì che la variabile si comporti come ti aspetti, specialmente considerando che il compilatore non ha modo di sapere in anticipo esattamente quanti thread saranno esistono nel tuo programma e quanti di questi toccheranno la variabile locale del thread.
thread_local
variabile locale non ha senso per cominciare ... ogni thread ha il proprio stack di chiamate.