Bonjour,

Je suis confronté au problème suivant : je travaille sur un projet C++ conséquent. Ce projet fait appel à une bibliothèque C et en particulier à une fonction, dont je peux modifier le code, mais pas la signature. Cette fonction utilise une variable globale. Le code ressemble donc à ça :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
int* maVariableGlobale;
 
void maFonctionC( void ) {
   //J'utilise la variable globale
   if(maVariableLocale != NULL)
      printf("Variable = %d\n", *maVariableGlobale);
}
Jusque là tout va bien. Sauf que dorénavant, ce programme va devenir un programme multi-thread, et chaque thread (y compris le thread principal du programme) :
  • fera appel à maFonctionC ;
  • devra conserver une valeur différente de cette variable globale.


Je vois pour l'instant une solution, qui serait d'utiliser le Thread Local Storage pour gérer cela. Avec la bibliothèque boost, ça donnerait par exemple le code suivant :

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
boost:thread_specific_ptr<int> maVariableGlobale;
 
void maFonctionC( void ) {
   //Je locke un mutex
   if(maVariableGlobale.get() != NULL)
      printf("Variable = %d\n", maVariableGlobale.get());
   //Je relâche le mutex
}
 
void fonctionPrincipaleDeMonThread( void )
{
   //Je locke un mutex
   maVariableGlobale.reset(new int(1492));
   //Je relâche le mutex
}
Je cherche une autre solution, qui passerait par une autre chose que TLS et pourquoi pas par du code lock-free.

Merci d'avance pour vos réponses.