Date::today() : initialisation thread safe d'un membre statique dans une lib
Bonjour à tous,
J'écris une librairie contenant une classe Date contenant une methode statique today(); qui permet de renvoyer un objet Date representant la date du jour:
Code:
1 2 3 4 5 6 7 8 9 10
|
class Date {
public:
[...]
static const Date& today();
private:
[...]
static Date todayd;
static bool today_init;
}; |
J'implemente today de cette maniere: (pour des raisons de perfs je ne veux faire l'initialisation de todayd qu'une seule fois, d'où le test via un booleen today_init)
Code:
1 2 3 4 5 6 7 8 9 10 11
|
bool Date::today_init=false; //initialisation des membres statiques
Date Date::todayd(1,1,1900);//initialisation des membres statiques
const Date& Date::today() {
if (!today_init) {
[...] // morceau de code qui initialise today
today_init=true;
}
return todayd;
} |
Maintenant ma question est la suivante : ma lib va etre appelée de l'exterieur par plusieurs threads, et en particulier Date::today() sera potentiellement appelée par plusieurs threads differents alors que l'initialisation de todayd n'est pas encore faite.
Cela risque donc de declancher plusieurs inits.
Plutot que d'utiliser un mutex couteux en perf ou de faire du code proche de celui du singleton threadsafe, je me demandais s'il ne suffit pas de forcer l'initialisation en ecrivant Date::today(); quelquepart dans le code de la librairie ?
Si je fais ca, ai-je la guarantie qu'il n'y a qu'un seul thread qui va executer mon initialisation, au chargement de la librairie, avant de passer dans le main() du programme principal et tous ses threads ? Est-ce la meilleure facon de proceder ?
Merci d'avance pour vos avis eclairés :)