archiviazione thread-local

Tutti i thread di un processo ne condividono lo spazio degli indirizzi virtuali. Le variabili locali di una funzione sono univoche per ogni thread che esegue la funzione. Tuttavia, le variabili statiche e globali sono condivise da tutti i thread nel processo. Con l'archiviazione locale thread (TLS), è possibile fornire dati univoci per ogni thread a cui il processo può accedere usando un indice globale. Un thread alloca l'indice, che può essere usato dagli altri thread per recuperare i dati univoci associati all'indice.

La costante TLS_MINIMUM_AVAILABLE definisce il numero minimo di indici TLS disponibili in ogni processo. Questo minimo è garantito che sia almeno 64 per tutti i sistemi. Il numero massimo di indici per processo è 1.088.

Quando vengono creati i thread, il sistema alloca una matrice di valori LPVOID per TLS, inizializzati in NULL. Prima di poter usare un indice, deve essere allocato da uno dei thread. Ogni thread archivia i dati per un indice TLS in uno slot TLS nella matrice. Se i dati associati a un indice si adattano a un valore LPVOID , è possibile archiviare i dati direttamente nello slot TLS. Tuttavia, se si usa un numero elevato di indici in questo modo, è preferibile allocare archiviazione separata, consolidare i dati e ridurre al minimo il numero di slot TLS in uso.

Il diagramma seguente illustra il funzionamento di TLS. Per un esempio di codice che illustra l'uso dell'archiviazione locale del thread, vedere Uso dell'archiviazione locale thread.

Diagramma che mostra il funzionamento del processo T L S.

Il processo include due thread, Thread 1 e Thread 2. Alloca due indici da usare con TLS, gdwTlsIndex1 e gdwTlsIndex2. Ogni thread alloca due blocchi di memoria (uno per ogni indice) in cui archiviare i dati e archivia i puntatori a questi blocchi di memoria negli slot TLS corrispondenti. Per accedere ai dati associati a un indice, il thread recupera il puntatore al blocco di memoria dallo slot TLS e lo archivia nella variabile locale lpvData.

È ideale usare TLS in una libreria di collegamento dinamico (DLL). Per un esempio, vedere Uso dell'archiviazione locale thread in una libreria di collegamenti dinamici.

Archiviazione locale thread (Visual C++)

Uso dell'archiviazione locale del thread

Uso dell'archiviazione locale del thread in una libreria di collegamenti dinamici