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