Zmienne globalne (lub zapisywalne dane statyczne - WSD) są zwykle przechowywane w bloku pamięci oddzielonym od stosu, sterta i kodu. Blok WSD jest tworzony i inicjowany przed uruchomieniem kodu wykonywalnego.
C++ 0x wprowadza słowo kluczowe thread_local
, które zapewnia utworzenie oddzielnej instancji zmiennej globalnej dla jednego wątku. Problem polega na tym, że w każdym wątku musi być załadowany inny blok.
Kolejna trudność polega na tym, że adres zmiennej nie jest ustalony w czasie połączenia i jest różny dla każdego wątku.
Istnieją dwa sposoby obejścia tego problemu. Jednym z nich jest, aby kompilator wygenerował wywołanie funkcji w celu uzyskania właściwego bloku, podczas gdy drugi ma zmienić ABI, aby przechowywać blok TLS w jednym z rejestrów procesorów. Można go następnie użyć z przesunięciami, aby uzyskać dostęp do poprawnej zmiennej thread_local
.
Różni się to od obsługi bibliotek, w której system operacyjny przechowuje pojedynczą wartość void*
, której można użyć, przechowuje wskaźnik do lokalnego bloku wątków, który został przydzielony na stercie procesu.
Jeśli chcesz poznać szczegóły, zobacz here.
Standard C++ ma zero (lub bardzo niewiele) szczegółów implementacji. –
To może teraz pomóc: http://www.akkadia.org/drepper/tls.pdf –