Nota
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare ad accedere o modificare le directory.
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare a modificare le directory.
Sezione specifica Microsoft
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. 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. Per una descrizione completa dei thread, vedere Processes and Threads (Processi e thread) in Windows 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. 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;
Nella dichiarazione di variabili thread-local associate in modo statico, è necessario attenersi a queste linee guida.
Le variabili thread-local con inizializzazione dinamica vengono inizializzate solo sul thread che causa la DLL da caricare e sui thread che sono già in esecuzione nel processo. Per altre informazioni, vedere thread.
È possibile applicare l'attributo thread solo a dichiarazioni e definizioni di dati. Non può essere utilizzato per dichiarare o definire funzioni. Il codice seguente, ad esempio, genera un errore di compilazione:
#define Thread __declspec( thread ) Thread void func(); /* Error */
È possibile specificare l'attributo thread solo per elementi di dati con durata di archiviazione statica. Ciò include i dati globali, statici ed extern, e i dati statici locali. Non è possibile dichiarare dati automatici con l'attributo thread. Il codice seguente, ad esempio, genera errori di compilazione:
#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. Il codice seguente genera ad esempio un errore:
#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. Il codice seguente, ad esempio, genera un errore di compilazione:
char *ch __declspec( thread ); /* Error */
L'indirizzo di una variabile locale di thread non è considerato costante, così come qualsiasi espressione che contenga tale indirizzo. Ciò significa che non è possibile utilizzare l'indirizzo di una variabile locale di thread come inizializzatore di un puntatore. Il codice seguente, ad esempio, viene contrassegnato come errore dal compilatore:
#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. Ad esempio:
#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.
L'uso di __declspec(thread) può interferire con il caricamento ritardato delle importazioni DLL.
Per altre informazioni sull'uso dell'attributo thread, vedere Multithreading Topics (Argomenti relativi al multithreading).
Fine sezione specifica Microsoft