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:
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 : Sélectionner tout - Visualiser dans une fenêtre à part
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; };
Code : Sélectionner tout - Visualiser dans une fenêtre à part
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
Partager