Magazyn lokalny wątku
Wszystkie wątki procesu współdzielą swoją wirtualną przestrzeń adresową. Zmienne lokalne funkcji są unikatowe dla każdego wątku, który uruchamia funkcję. Jednak zmienne statyczne i globalne są współużytkowane przez wszystkie wątki w procesie. W przypadku wątku lokalnego magazynu (TLS) można podać unikatowe dane dla każdego wątku, do którego proces może uzyskać dostęp przy użyciu indeksu globalnego. Jeden wątek przydziela indeks, który może być używany przez inne wątki do pobierania unikatowych danych skojarzonych z indeksem.
Stała TLS_MINIMUM_AVAILABLE definiuje minimalną liczbę indeksów TLS dostępnych w każdym procesie. To minimum jest gwarantowane co najmniej 64 dla wszystkich systemów. Maksymalna liczba indeksów na proces wynosi 1088.
Po utworzeniu wątków system przydziela tablicę wartości LPVOID dla protokołu TLS, które są inicjowane na wartość NULL. Aby można było użyć indeksu, należy go przydzielić za pomocą jednego z wątków. Każdy wątek przechowuje dane indeksu TLS w w tablicy. Jeśli dane skojarzone z indeksem będą mieścić się w wartości LPVOID, dane można przechowywać bezpośrednio w miejscu protokołu TLS. Jeśli jednak w ten sposób używasz dużej liczby indeksów, lepiej jest przydzielić oddzielny magazyn, skonsolidować dane i zminimalizować liczbę używanych miejsc protokołu TLS.
Na poniższym diagramie pokazano, jak działa protokół TLS. Aby zapoznać się z przykładem kodu ilustrującym użycie magazynu lokalnego wątku, zobacz Using Thread Local Storage.
Proces ma dwa wątki, Thread 1 i Thread 2. Przydziela dwa indeksy do użycia z protokołami TLS, gdwTlsIndex1 i gdwTlsIndex2. Każdy wątek przydziela dwa bloki pamięci (jeden dla każdego indeksu), w którym mają być przechowywane dane, i przechowuje wskaźniki do tych bloków pamięci w odpowiednich gniazdach protokołu TLS. Aby uzyskać dostęp do danych skojarzonych z indeksem, wątek pobiera wskaźnik do bloku pamięci z miejsca protokołu TLS i przechowuje je w zmiennej lokalnej lpvData.
Idealnie nadaje się do używania protokołu TLS w bibliotece linków dynamicznych (DLL). Aby zapoznać się z przykładem, zobacz Using Thread Local Storage in a Dynamic Link Library (Używanie magazynu lokalnego wątku w bibliotece linków dynamicznych).
Tematy pokrewne
-
magazynu lokalnego wątku (Visual C++)
-
używanie magazynu lokalnego wątku w bibliotece linków dynamicznych