Comme ça.
struct some_struct
{
// Other fields
.....
__thread int tl;
}
J'essaie de faire cela, mais le compilateur me donne cette erreur.
./cv.h:16:2: error: '__thread' is only allowed on variable declarations
__thread int tl;
Le stockage local des threads ne s'applique qu'aux variables statiques. Il est inutile de rendre les membres de la structure ou de la classe non statiques thread-local.
Les variables locales (automatiques) sont toujours spécifiques au thread qui exécute le code, mais les variables globales et statiques sont partagées entre les threads car elles résident dans le segment de données ou le segment BSS. TLS fournit un mécanisme permettant de rendre ces variables globales locales dans le thread, ce que le mot clé __thread
permet d'obtenir: il demande au compilateur de créer une copie distincte de la variable dans chaque thread tout en conservant une variable globale (par exemple, différentes fonctions appelées dans le même thread d’exécution).
Les membres de classe et les membres de structure non statiques sont placés au même endroit où l'objet (classe ou structure) est alloué, soit dans la pile si une variable automatique est déclarée, soit dans le tas si new
ou malloc()
est utilisé. Dans les deux cas, chaque thread reçoit un emplacement de stockage unique pour la variable et __thread
n'est tout simplement pas applicable dans ce cas, d'où l'erreur du compilateur que vous obtenez.
gcc
impose les restrictions suivantes à l’utilisation de __thread
:
Le spécificateur
__thread
peut être appliqué à tout membre de données global, statique de fichier, statique de fonction ou statique d'une classe Il ne peut pas être appliqué à un membre de données automatique ou non statique à portée de bloc.
Le modificateur __thread
est pris en charge par plusieurs compilateurs. Il n'est pas inconcevable que les restrictions exactes varient quelque peu d'un compilateur à l'autre.
C11 standard Section 6.7.1 Paragraphe 2
Au plus, un spécificateur de classe de stockage peut être indiqué dans les spécificateurs de déclaration d'une déclaration, sauf que _Thread_local peut apparaître avec static ou extern.120)
Norme C11 Section 6.7.1 Paragraphe 3
Dans la déclaration d'un objet avec une portée de bloc, si les spécificateurs de déclaration incluent _Thread_local, ils doivent également inclure static ou extern. Si _Thread_local apparaît dans une déclaration d'objet, il doit être présent dans chaque déclaration de cet objet.
Vous devriez changer __thread int tl;
en thread_local static int tl;
Selon l'ancien livre «Programmation Windows» de Petzold (page 1241), vous marquez une variable comme thread local à l'aide des mots-clés: __declspec (thread). Ainsi, par exemple: __declspec (thread) int iGlobal = 1;
Je doute que cela puisse être fait dans une classe cependant. Vous pouvez également rendre la variable statique aussi. [edit] vient de réaliser que vous ne courez probablement pas sous Windows ... Donc, je suppose que pour tous ceux qui ont besoin d'une réponse à Windows, cela peut être pertinent.
Pour C cela n'a pas beaucoup de sens, les membres static
(= global) ne sont qu'une fonctionnalité du C++. Et donc, la nouvelle norme C11 (qui introduit _Thread_local
) ne le permet pas. Ces bêtes sont autorisées pratiquement partout où une variable avec une durée de stockage statique est autorisée.
Pour C++, cela pourrait avoir un sens dans une classe analogue à un membre static
, mais si cela est autorisé par C++ 11, je n'en ai aucune idée.