archiviazione thread-localThread Local Storage

Sezione specifica MicrosoftMicrosoft Specific

L'archiviazione thread-local (TLS, Thread-Local Storage) è il meccanismo attraverso il quale ogni thread in un dato processo multithread alloca lo spazio di archiviazione per i dati specifici dei thread.Thread Local Storage (TLS) is the mechanism by which each thread in a given multithreaded process allocates storage for thread-specific data. Nei programmi multithread standard, i dati vengono condivisi da tutti i thread di un determinato processo, mentre l'archiviazione thread-local è il meccanismo che consente di allocare i dati per singoli thread.In standard multithreaded programs, data is shared among all threads of a given process, whereas thread local storage is the mechanism for allocating per-thread data. Per una trattazione completa dei thread, vedere Processes and Threads (Processi e thread) in --- --- Windows SDKWindows SDK.For a complete discussion of threads, see Processes and Threads in the --- --- Windows SDKWindows SDK.

Il linguaggio C Microsoft include l'attributo esteso di classe di archiviazione, thread, che viene usato con la parola chiave __declspec per dichiarare una variabile thread-local.The Microsoft C language includes the extended storage-class attribute, thread, which is used with the __declspec keyword to declare a thread local variable. Nel codice seguente, ad esempio, viene dichiarata una variabile locale di thread di tipo integer e quindi inizializzata con un valore:For example, the following code declares an integer thread local variable and initializes it with a value:

__declspec( thread ) int tls_i = 1;  

Nella dichiarazione di variabili thread-local associate in modo statico, è necessario attenersi a queste linee guida.These guidelines must be observed when you are declaring statically bound thread local variables:

  • L'attributo __declspec(thread) può interferire con il caricamento ritardato delle importazioni delle DLL.The use of __declspec(thread) may interfere with delay loading of DLL imports.

  • È possibile applicare l'attributo thread solo a dichiarazioni e definizioni di dati.You can apply the thread attribute only to data declarations and definitions. Non può essere utilizzato per dichiarare o definire funzioni.It cannot be used on function declarations or definitions. Il codice seguente, ad esempio, genera un errore di compilazione:For example, the following code generates a compiler error:

    #define Thread   __declspec( thread )  
    Thread void func();      /* Error */  
    
  • È possibile specificare l'attributo thread solo per elementi di dati con durata di archiviazione statica.You can specify the thread attribute only on data items with static storage duration. Ciò include i dati globali, statici ed extern, e i dati statici locali.This includes global data (both static and extern) and local static data. Non è possibile dichiarare dati automatici con l'attributo thread.You cannot declare automatic data with the thread attribute. Il codice seguente, ad esempio, genera errori di compilazione:For example, the following code generates compiler errors:

    #define Thread   __declspec( thread )  
    void func1()  
    {  
        Thread int tls_i;            /* Error */  
    }  
    
    int func2( Thread int tls_i )    /* Error */  
    {  
       return tls_i;  
    }  
    
  • È necessario utilizzare l'attributo thread per la dichiarazione e la definizione di dati locali di thread, che la definizione e la dichiarazione si verificano nello stesso file o in file separati.You must use the thread attribute for the declaration and the definition of thread local data, regardless of whether the declaration and definition occur in the same file or separate files. Il codice seguente genera ad esempio un errore:For example, the following code generates an error:

    #define Thread   __declspec( thread )  
    extern int tls_i;     /* This generates an error, because the   */  
    int Thread tls_i;     /* declaration and the definition differ. */  
    
  • L'attributo thread non può essere utilizzato come modificatore di tipo.You cannot use the thread attribute as a type modifier. Il codice seguente, ad esempio, genera un errore di compilazione:For example, the following code generates a compiler error:

    char *ch __declspec( thread );      /* Error */  
    
  • L'indirizzo di una variabile locale di thread non è considerato costante, così come qualsiasi espressione che contenga tale indirizzo.The address of a thread local variable is not considered constant, and any expression involving such an address is not considered a constant expression. Ciò significa che non è possibile utilizzare l'indirizzo di una variabile locale di thread come inizializzatore di un puntatore.This means that you cannot use the address of a thread local variable as an initializer for a pointer. Il codice seguente, ad esempio, viene contrassegnato come errore dal compilatore:For example, the compiler flags the following code as an error:

    #define Thread   __declspec( thread )  
    Thread int tls_i;  
    int *p = &tls_i;      /* Error */  
    
  • Il linguaggio C consente di inizializzare una variabile con un'espressione che include un riferimento a se stessa, ma solo per oggetti di tipo non statico.C permits initialization of a variable with an expression involving a reference to itself, but only for objects of nonstatic extent. Ad esempio:For example:

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

    Tenere presente che un'espressione sizeof che include la variabile in fase di inizializzazione non rappresenta un riferimento a se stessa ed è consentita.Note that a sizeof expression that includes the variable being initialized does not constitute a reference to itself and is allowed.

  • L'attributo __declspec(thread) può interferire con il caricamento ritardato delle importazioni delle DLL.The use of __declspec(thread) may interfere with delay loading of DLL imports.

    Per altre informazioni sull'uso dell'attributo thread, vedere Multithreading Topics (Argomenti relativi al multithreading).For more information about using the thread attribute, see Multithreading Topics.

    Fine sezione specifica MicrosoftEND Microsoft Specific

Vedere ancheSee Also

Attributi di classi di archiviazione estesi CC Extended Storage-Class Attributes