Threadlokaler Speicher
Alle Threads eines Prozesses teilen sich dessen virtuellen Adressraum. Die lokalen Variablen einer Funktion sind für jeden Thread eindeutig, der die Funktion ausführt. Die statischen und globalen Variablen werden jedoch von allen Threads im Prozess gemeinsam verwendet. Mit dem lokalen Threadspeicher (Thread Local Storage , TLS) können Sie eindeutige Daten für jeden Thread bereitstellen, auf den der Prozess mithilfe eines globalen Indexes zugreifen kann. Ein Thread ordnet den Index zu, der von den anderen Threads verwendet werden kann, um die eindeutigen Daten abzurufen, die dem Index zugeordnet sind.
Die konstante TLS_MINIMUM_AVAILABLE definiert die Mindestanzahl von TLS-Indizes, die in jedem Prozess verfügbar sind. Dieser Mindestwert ist für alle Systeme garantiert mindestens 64. Die maximale Anzahl von Indizes pro Prozess beträgt 1.088.
Wenn die Threads erstellt werden, ordnet das System ein Array von LPVOID-Werten für TLS zu, die mit NULL initialisiert werden. Bevor ein Index verwendet werden kann, muss er von einem der Threads zugeordnet werden. Jeder Thread speichert seine Daten für einen TLS-Index in einem TLS-Slot im Array. Wenn die einem Index zugeordneten Daten in einen LPVOID-Wert passen, können Sie die Daten direkt im TLS-Slot speichern. Wenn Sie jedoch eine große Anzahl von Indizes auf diese Weise verwenden, ist es besser, separaten Speicher zuzuweisen, die Daten zu konsolidieren und die Anzahl der verwendeten TLS-Slots zu minimieren.
Das folgende Diagramm veranschaulicht die Funktionsweise von TLS. Ein Codebeispiel zur Veranschaulichung der Verwendung des lokalen Threadspeichers finden Sie unter Verwenden des lokalen Threadspeichers.
Der Prozess verfügt über zwei Threads, Thread 1 und Thread 2. Es werden zwei Indizes für die Verwendung mit TLS zugeordnet: gdwTlsIndex1 und gdwTlsIndex2. Jeder Thread weist zwei Speicherblöcke (einen für jeden Index) zu, in denen die Daten gespeichert werden sollen, und speichert die Zeiger auf diese Speicherblöcke in den entsprechenden TLS-Slots. Um auf die einem Index zugeordneten Daten zuzugreifen, ruft der Thread den Zeiger auf den Speicherblock aus dem TLS-Slot ab und speichert ihn in der lokalen Variablen lpvData.
Es ist ideal, TLS in einer Dll (Dynamic Link Library) zu verwenden. Ein Beispiel finden Sie unter Verwenden des lokalen Threadspeichers in einer Dynamic Link-Bibliothek.
Zugehörige Themen