Freigeben über


Lokaler Threadspeicher und vom Thread verwendete statische Felder

Verwaltete lokale Threadspeicher und threadbezogene statische Felder können zur Speicherung von Daten verwendet werden, die für einen Thread und eine Anwendungsdomäne spezifisch sind. Verwenden Sie threadbezogene statische Felder, wenn Sie die Anforderungen zur Kompilierungszeit genau einschätzen können. Verwenden Sie lokale Threadspeicher, wenn die aktuellen Erfordernisse nur während der Laufzeit ermittelt werden können.

In nicht verwaltetem C++ wird TlsAlloc verwendet, um Slots dynamisch zuzuweisen, und __declspec(thread), um zu deklarieren, dass eine Variable threadbezogen zugewiesen werden soll. Lokale Threadspeicher und threadbezogene statische Felder stellen die verwaltete Version dieses Verhaltens bereit.

Lokale Threadspeicher

Verwaltete lokale Threadspeicher stellen dynamische Datenumsetzungsplätze bereit, die für den Thread und die Kombination von Anwendung und Domäne eindeutig sind. Es gibt zwei Arten von Datenumsetzungsplätzen: benannte und nicht benannte. Benannte Umsetzungsplätze können von Vorteil sein, weil sie die Verwendung eines mnemonischen Bezeichners ermöglichen. Wenn jedoch eine andere Komponente den gleichen Namen für ihren threadbezogenen Speicher verwendet und ein Thread Code sowohl aus Ihrer Komponente als auch aus der anderen Komponente ausführt, können die beiden Komponenten die Daten der jeweils anderen Komponente beschädigen. Dies können Sie verhindern, indem Sie einen privaten unbenannten Datenumsetzungsplatz verwenden.

Hinweis

Sowohl benannte als auch unbenannte Datenumsetzungsplätze sind threadspezifisch. Ein Thread kann keine Daten aus einem anderen Thread modifizieren, selbst, wenn er den gleichen benannten Datenumsetzungsplatz verwendet. Ein Konflikt kann nur dann auftreten, wenn der gleiche Thread zwei verschiedene Codeteile ausführt, die denselben benannten Datenumsetzungsplatz verwenden.

Um verwalteten lokalen Threadspeicher verwenden zu können, erstellen Sie den Datenumsetzungsplatz einfach mithilfe von Thread.AllocateNamedDataSlot oder Thread.AllocateDataSlot und verwenden die entsprechenden Methoden, um Informationen dort zu speichern oder abzurufen.

Threadbezogene statische Felder

Wenn Sie wissen, dass ein Feld Ihres Typs für einen Thread und eine Kombination von Anwendung und Domäne immer eindeutig sein sollte, ergänzen Sie ein statisches Feld durch ThreadStaticAttribute. Beachten Sie unbedingt, dass jeder beliebige Klassenkonstruktorcode auf dem ersten Thread im ersten Kontext, der auf das Feld zugreift, gestartet werden kann. In allen anderen Threads oder Kontexten werden die Felder mit null (Nothing in Visual Basic) initialisiert, wenn sie Verweistypen sind, bzw. mit ihren Standardwerten, wenn es sich um Werttypen handelt. Daher sollten Sie sich nicht auf Klassenkonstruktoren verlassen, um threadbezogene statische Felder zu initialisieren. Stattdessen sollten Sie immer davon ausgehen, dass threadbezogene statische Felder mit null (Nothing) oder mit ihren Standardwerten initialisiert werden.

Siehe auch

Referenz

ContextStaticAttribute
Thread.GetNamedDataSlot
ThreadStaticAttribute
CallContext

Weitere Ressourcen

Verwaltetes Threading