web-dev-qa-db-fra.com

Pouvez-vous utiliser des variables locales de thread dans une classe ou une structure

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;
21
pythonic

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.

14
Hristo Iliev

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.

7
NPE

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.

4
phoxis

Vous devriez changer __thread int tl; en thread_local static int tl;

3
Lingxi

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.

2
C Johnson

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.

0
Jens Gustedt