Threadlokaler Speicher

Microsoft-spezifisch

Der threadlokale Speicher (TLS) ist der Mechanismus, mit dem jeder Thread in einem Multithreadprozess den Speicher für threadspezifische Daten zuordnet. In den standardmäßigen Multithreadprogrammen werden Daten auf allen Threads eines angegebenen Prozesses freigegeben, während der threadlokale Speicher der Mechanismus zum Zuordnen der threadspezifischen Daten ist. Eine vollständige Erörterung der Threads finden Sie im Windows SDK unter Processes and Threads (Prozesse und Threads).

Die Microsoft-Programmiersprache C schließt das erweiterte Speicherklassenattribut, „thread“, mit ein, das mit dem __declspec-Schlüsselwort verwendet wird, um eine threadlokale Variable zu deklarieren. Mit folgendem Code wird z. B. eine Ganzzahl-TLS-Variable deklariert und mit einem Wert initialisiert:

__declspec( thread ) int tls_i = 1;

Diese Richtlinien müssen bei der Deklaration von statisch gebundenen threadlokalen Variablen beachtet werden:

  • Lokale Threadvariablen, die über dynamische Initialisierung verfügen, werden nur auf in dem Thread initialisiert, durch den die DLL geladen wird, und in Threads, die bereits im Prozess ausgeführt werden. Weitere Informationen finden Sie unter Thread.

  • Sie können das Threadattribut nur auf Datendeklarationen und -definitionen anwenden. Die Verwendung in Funktionsdeklarationen oder -definitionen ist nicht zulässig. Beispielsweise verursacht der folgende Code einen Compilerfehler:

    #define Thread   __declspec( thread )
    Thread void func();      /* Error */
    
  • Sie können das thread-Attribut nur für Datenelemente mit statischer Speicherdauer angeben. Hierzu zählen globale Daten (statisch und extern) und lokale statische Daten. Sie können automatische Daten nicht mit dem thread-Attribut deklarieren. Beispielsweise verursacht der folgende Code Compilerfehler:

    #define Thread   __declspec( thread )
    void func1()
    {
        Thread int tls_i;            /* Error */
    }
    
    int func2( Thread int tls_i )    /* Error */
    {
       return tls_i;
    }
    
  • Sie müssen das thread-Attribut für die Deklaration und Definition von threadlokale Daten verwenden, unabhängig davon, ob die Deklaration und Definition in der gleichen Datei oder in separaten Dateien auftreten. Durch folgenden Code wird z. B. ein Fehler verursacht:

    #define Thread   __declspec( thread )
    extern int tls_i;     /* This generates an error, because the   */
    int Thread tls_i;     /* declaration and the definition differ. */
    
  • Sie können das thread-Attribut nicht als Typmodifizierer verwenden. Beispielsweise verursacht der folgende Code einen Compilerfehler:

    char *ch __declspec( thread );      /* Error */
    
  • Die Adresse einer threadlokalen Variablen wird nicht als konstant angesehen und jeder Ausdruck mit einer solchen Adresse nicht als konstanter Ausdruck. Dies bedeutet, dass Sie die Adresse einer threadlokalen Variablen nicht als Initialisierer für einen Zeiger verwenden können. Folgender Code wird z. B. vom Compiler mit einem Fehlerflag versehen:

    #define Thread   __declspec( thread )
    Thread int tls_i;
    int *p = &tls_i;      /* Error */
    
  • In C ist die Initialisierung einer Variablen mit einem Ausdruck zulässig, der einen Verweis auf sich selbst enthält. Dies gilt jedoch nur für Objekte, die keinen statischen Wertebereich aufweisen. Zum Beispiel:

    #define Thread   __declspec( thread )
    Thread int tls_i = tls_i;             /* Error */
    int j = j;                            /* Error */
    Thread int tls_i = sizeof( tls_i )    /* Okay  */
    

    Beachten Sie, dass ein sizeof-Ausdruck, der die Variable enthält, die derzeit initialisiert wird, keinen Verweis auf sich selbst darstellt und zulässig ist.

  • Die Verwendung von __declspec(thread) kann beim verzögerten Laden von DLL-Importen zu Konflikten führen.

Weitere Informationen zur Verwendung des Threadattributs finden Sie unter Multithreading-Themen.

Ende Microsoft-spezifisch

Siehe auch

C-Speicherklassenattribute (erweitert)