Udostępnij za pośrednictwem


wątek

Specyficzne dla firmy Microsoft

Rozszerzony modyfikator klasy przechowywania thread jest używany, aby zadeklarować zmienną lokalną wątku.

__declspec( thread ) declarator

Uwagi

Pamięć lokalna wątku (TLS) to mechanizm, za pomocą którego każdy wątek w procesie wielowątkowym przydziela pamięć dla danych specyficznych od wątku.W standardowych programach wielowątkowych, dane są współużytkowane przez wszystkie wątki danego procesu, natomiast pamięć lokalna wątku jest mechanizmem przydzielania danych osobno dla danego wątku.Aby uzyskać pełne omówienie wątków, zobacz Wielowątkowość.

Deklaracje zmiennych lokalnych wątku muszą używać składni atrybutów rozszerzonych i słów kluczowych __declspec oraz thread.Na przykład, poniższy kod deklaruje lokalną zmienną całkowitą wątku i inicjuje ją wartością:

__declspec( thread ) int tls_i = 1;

Musisz przestrzegać następujących wytycznych podczas deklarowania obiektów i zmiennych lokalnych wątku:

  • Atrybut thread można stosować tylko do deklaracji i definicji danych oraz klas, które nie posiadają funkcji członkowskich; atrybut thread nie może być używany do deklaracji ani definicji funkcji.

  • Użycie atrybutu thread może kolidować z opóźnionym ładowaniem importowanych bibliotek DLL**.**

  • Atrybut thread można określić tylko dla elementów danych ze statycznym czasem trwania pamięci.Dotyczy to globalnych obiektów danych (zarówno static, jak i extern), lokalnych obiektów statycznych i statycznych elementów członkowskich danych klas.Za pomocą atrybutu thread nie możesz deklarować automatycznych obiektów danych.

  • Musisz użyć atrybutu thread dla deklaracji i definicji lokalnego obiektu wątku, niezależnie od tego czy deklaracja i definicja występują w tym samym pliku, czy w oddzielnych plikach.

  • Nie można używać atrybutu thread jako modyfikatora typu.

  • Tylko klasy POD mogą być instancjonowane przy użyciu __declspec(thread).Atrybut "thread" jest ignorowany, jeśli żaden obiekt nie został zadeklarowany jako część deklaracji klasy.Na przykład:

    // 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
    
  • Ponieważ dozwolona jest deklaracja obiektów, które używają atrybutu thread, dwa poniższe przykłady są semantycznie równoważne:

    // 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.
    
  • Standardowy język C umożliwia inicjowanie obiektu lub zmiennej za pomocą wyrażenia zawierającego odwołanie do samego siebie, ale tylko dla obiektów o zakresie niestatycznym.Mimo że język C++ normalnie dopuszcza dynamiczną inicjalizację obiektu za pomocą wyrażenia zawierającego odwołanie do samego siebie, to ten typ inicjalizacji jest niedozwolony dla obiektów lokalnych wątku.Na przykład:

    // 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++
    

    Zauważ, że wyrażenie sizeof, które zawiera inicjowany obiekt, nie stanowi odwołania do samego siebie i jest dozwolone w językach C i C++.

KONIEC informacji specyficznych dla firmy Microsoft

Zobacz też

Informacje

__declspec

Słowa kluczowe języka C++

Koncepcje

Lokalny magazyn wątków (TLS)