Condividi tramite


thread

Sezione specifica Microsoft

Il modificatore di classe di archiviazione esteso thread viene utilizzato per dichiarare una variabile locale di thread.

__declspec( thread ) declarator

Note

L'archiviazione locale di thread (TLS, Thread Local Storage) rappresenta il meccanismo mediante il quale ogni processo multithread alloca lo spazio di archiviazione per i dati specifici del thread. Nei programmi multithread standard, i dati vengono condivisi da tutti i thread di un determinato processo, mentre l'archiviazione locale di thread è il meccanismo che consente di allocare i dati per thread. Per informazioni complete sui thread, vedere Multithreading.

Le dichiarazioni delle variabili locali di thread devono utilizzare la sintassi degli attributi estesa e la parola chiave __declspec con la parola chiave thread. Nel codice seguente, ad esempio, viene dichiarata una variabile locale di thread di tipo integer e quindi inizializzata con un valore:

__declspec( thread ) int tls_i = 1;

È necessario tenere presenti queste linee guida quando si dichiarano gli oggetti e le variabili locali di thread:

  • È possibile applicare l'attributo thread solo a dichiarazioni e definizioni di dati, nonché alle classi che non hanno funzioni membro; non può essere invece utilizzato per le dichiarazioni o le definizioni delle funzioni.

  • L'attributo thread può interferire con il caricamento ritardato delle importazioni delle DLL**.**.

  • È possibile specificare l'attributo thread solo per elementi di dati con durata di archiviazione statica. Sono inclusi gli oggetti di dati globali (sia statici che extern), gli oggetti statici locali e i membri di dati statici delle classi. Non è possibile dichiarare oggetti di dati automatici con l'attributo thread.

  • È necessario utilizzare l'attributo thread per la dichiarazione e la definizione di un oggetto locale di thread, indipendentemente dal fatto che la definizione e la dichiarazione si verificano nello stesso file o in file separati.

  • L'attributo thread non può essere utilizzato come modificatore di tipo.

  • È possibile creare un'istanza delle classi POD solo utilizzando __declspec(thread). L'attributo thread viene ignorato se nessun oggetto viene dichiarato come parte della dichiarazione di classe. Ad esempio:

    // 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
    
  • Poiché la dichiarazione di oggetti che utilizzano l'attributo thread è consentita, i due esempi seguenti sono equivalenti dal punto di vista semantico:

    // 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.
    
  • Il linguaggio C standard consente di inizializzare un oggetto o una variabile con un'espressione che include un riferimento a se stessa, ma solo per oggetti con estensione non statica. Sebbene il linguaggio C++ consenta in genere l'inizializzazione dinamica di un oggetto con un'espressione che include un riferimento a se stessa, questo tipo di inizializzazione non è consentito con gli oggetti locali di thread. Di seguito è riportato un esempio:

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

    Tenere presente che un'espressione sizeof che include l'oggetto in fase di inizializzazione non è un riferimento a se stessa ed è consentita sia in C che in C++.

Fine sezione specifica Microsoft

Vedere anche

Riferimenti

__declspec

Parole chiave C++

Concetti

Archiviazione locale di thread (TLS)