Lokalny magazyn wątków jest statyczny, ale zachowuje się zupełnie inaczej niż zwykły magazyn statyczny.
Podczas deklarowania zmiennej statycznej istnieje dokładnie jedno wystąpienie zmiennej. Kompilator / system wykonawczy gwarantuje, że zostanie on zainicjowany kiedyś, zanim faktycznie go użyjesz, bez określania dokładnego czasu (niektóre szczegóły tutaj pominięto).
C ++ 11 gwarantuje, że ta inicjalizacja będzie bezpieczna wątkowo, jednak przed C ++ 11 to bezpieczeństwo wątku nie było gwarantowane. Na przykład
static X * pointer = new X;
może przeciekać instancje X, jeśli więcej niż jeden wątek trafi w statyczny kod inicjujący w tym samym czasie.
Kiedy deklarujesz zmienną wątek lokalną, istnieje potencjalnie wiele wystąpień zmiennej. Możesz myśleć o nich jako o mapach indeksowanych przez identyfikator wątku. Oznacza to, że każdy wątek widzi własną kopię zmiennej.
Ponownie, jeśli zmienna zostanie zainicjowana, kompilator / system wykonawczy gwarantuje, że inicjalizacja nastąpi przed użyciem danych i że inicjalizacja nastąpi dla każdego wątku, który używa tej zmiennej. Kompilator gwarantuje również, że inicjacja będzie bezpieczna wątkowo.
Gwarancja bezpieczeństwa wątków oznacza, że może istnieć sporo zakulisowego kodu, który sprawi, że zmienna będzie zachowywać się tak, jak się tego spodziewasz - zwłaszcza biorąc pod uwagę, że kompilator nie ma możliwości z wyprzedzeniem dowiedzieć się, ile dokładnie wątków będzie istnieje w twoim programie i ile z nich dotknie zmiennej lokalnej wątku.
thread_local
zmiennej lokalnej nie ma sensu zaczynać od… każdy wątek ma swój własny stos wywołań.