Passage au multithread d'une variable globale C en évitant l'utilisation de TLS
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:
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:
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.