Freigeben über


Thread

Microsoft-spezifisch

Der erweiterte Speicherklassenmodifizierer thread wird verwendet, um einen Thread für eine lokale Variable zu deklarieren.

__declspec( thread ) declarator

Hinweise

Lokaler Threadspeicher (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 lokale Threadspeicher der Mechanismus zum Zuordnen der threadspezifischen Daten ist. Eine detaillierte Erläuterung zu Threads finden Sie unter Multithreading.

Deklarationen von lokalen Variablen des Threads müssen eine erweiterte Attributsyntax und das __declspec-Schlüsselwort mit dem thread-Schlüsselwort verwenden. Mit folgendem Code wird z. B. eine Ganzzahl-TLS-Variable deklariert und mit einem Wert initialisiert:

__declspec( thread ) int tls_i = 1;

Sie müssen diese Richtlinien beachten, wenn Sie lokale Objekte und Variablen eines Threads deklarieren:

  • Sie können das thread-Attribut nur auf Datendeklarationen und -definitionen sowie auf Klassen anwenden, die keine Memberfunktionen enthalten. thread kann nicht für Funktionsdeklarationen oder - definitionen verwendet werden.

  • Die Verwendung des thread-Attributs kann mit dem verzögerten Laden von DLL-Importen in Konflikt treten**.**

  • Sie können das thread-Attribut nur für Datenelemente mit statischer Speicherdauer angeben. Hierzu zählen globale Datenobjekte (sowohl static als auch extern), lokale statische Objekte sowie statische Datenmember von Klassen. Sie können automatische Datenobjekte nicht mit dem thread-Attribut deklarieren.

  • Sie müssen das thread-Attribut für die Deklaration und Definition eines lokalen Threadobjekts verwenden, egal ob die Deklaration und Definition in der gleichen Datei oder in separaten Dateien auftreten.

  • Sie können das thread-Attribut nicht als Typmodifizierer verwenden.

  • Nur POD-Klassen können mit __declspec(thread) instanziiert werden. Das Threadattribut wird ignoriert, wenn kein Objekt als Teil der Klassendeklaration deklariert ist. Beispiel:

    // declspec_thread.cpp
    // compile with: /LD
    __declspec(thread) class X
    {
    public:
       int I; 
    } x;   // x is a thread object
    
    X y;   // y is not a thread object
    
  • Da die Deklaration von Objekten, die das thread-Attribut verwenden, zulässig ist, sind diese beiden Beispiele semantisch gleichwertig:

    // declspec_thread_2.cpp
    // compile with: /LD
    __declspec( thread ) class B {
    public:
       int data;
    } BObject;   // BObject declared thread local.
    
    class B2 {
    public:
       int data;
    };
    __declspec( thread ) B2 BObject2;   // BObject2 declared thread local.
    
  • In Standard-C ist die Initialisierung eines Objekts oder 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. Obwohl in C++ diese dynamische Objektinitialisierung mit einem Ausdruck, der einen Verweis auf sich selbst enthält, normalerweise zulässig ist, ist dieser Initialisierungstyp für lokale Threadobjekte nicht zulässig. Beispiel:

    // declspec_thread_3.cpp
    // compile with: /LD
    #define Thread __declspec( thread )
    int j = j;   // Okay in C++; C error
    Thread int tls_i = sizeof( tls_i );   // Okay in C and C++
    

    Beachten Sie, dass ein sizeof-Ausdruck, der das Objekt enthält, das derzeit initialisiert wird, keinen Verweis auf sich selbst darstellt und sowohl in C als auch in C++ zulässig ist.

END Microsoft-spezifisch

Siehe auch

Referenz

__declspec

C++-Schlüsselwörter

Konzepte

Lokaler Threadspeicher (TLS)