Conserver les variables pthread locales

Existe-t-il un moyen, lors de l’utilisation de pthread.h sur un Linux GCC, de conserver les variables locales à la fonction de thread:

 int i = 42; // global instance of i int main() { pthread_t threads[2]; long t; pthread_create(&threads[t], NULL, ThreadFunction, (void *) t; pthread_create(&threads[t], NULL, ThreadFunction2, (void *) t; } 

Je me demande s’il existe un paramètre dans la fonction POSIX créant le nouveau thread et conservant les variables locales:

 void *ThreadFunction(void *threadid) { int i=0; i++; // this is a local instance of i printf("i is %d", i); // as expected: 1 } void *ThreadFunction2(void *threadid) { i += 3; // another local instance -> problem } 

Où ensuite i 42. Même si j’ai défini un i auparavant, je veux que cela ne soit pas dans mes discussions.

Les variables globales sont toujours disponibles dans l’ensemble de l’unité de compilation (ou même plusieurs unités de compilation si vous utilisez des déclarations externes). Cela n’a rien à voir avec les threads, c’est le comportement par défaut de C / C ++. La solution recommandée est de ne pas utiliser de globals – les globals sont diaboliques. Si vous devez toujours utiliser des éléments globaux, vous pouvez les préfixer, tels que g_i . Une autre solution consiste à placer les fonctions de votre fil dans une autre unité de compilation (fichier c).

Dans gcc, vous pouvez créer une variable globale thread-local à l’aide du spécificateur __thread :

 __thread int i = 42; 

Ne fais pas ça. Il existe de meilleures solutions, selon ce que vous souhaitez faire.

L’exemple de code est faux (par lui-même) et a un comportement indéfini. Vous essayez de lire une variable t non initialisée t quatre fois – deux fois pour indexer un tableau et deux fois dans une expression de conversion – et, en fonction de la signification (non définie) de &threads[t] , la fonction pthread_create peut provoquer davantage d’UB.

De plus, ce n’est évidemment pas le code que vous avez utilisé car les fonctions pthread_create manquent de parenthèses fermantes.

En ce qui concerne la variable i : déclarer une nouvelle variable i (c’est-à-dire int i = 0 ) dans la scope locale masque tous les i possibles dans la scope plus large. Il ne devrait donc pas y avoir de problème à utiliser i localement comme nom de variable dans la fonction. .

phtread a une notion de stockage local de threads et gcc offre une interface simple avec une classe de stockage __thread . De telles variables souffrent de tous les problèmes des variables globales, et plus encore. Mais elles sont parfois utiles car toutes les autres solutions sont pires dans leur contexte.