IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Threads & Processus C++ Discussion :

Date::today() : initialisation thread safe d'un membre statique dans une lib


Sujet :

Threads & Processus C++

  1. #1
    Membre à l'essai
    Inscrit en
    Juillet 2005
    Messages
    26
    Détails du profil
    Informations forums :
    Inscription : Juillet 2005
    Messages : 26
    Points : 19
    Points
    19
    Par défaut 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 : 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;
    };
    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
    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

  2. #2
    Rédacteur
    Avatar de Laurent Gomila
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2003
    Messages
    10 651
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Points : 15 920
    Points
    15 920
    Par défaut
    Je pense que le mieux est d'initialiser ta variable lors de sa définition :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    namespace // namespace anonyme pour restreindre la portée de la fonction à ce fichier
    {
        Date InitToday()
        {
            ...
        }
    }
     
    Date Date::todayd = InitToday();

  3. #3
    Membre à l'essai
    Inscrit en
    Juillet 2005
    Messages
    26
    Détails du profil
    Informations forums :
    Inscription : Juillet 2005
    Messages : 26
    Points : 19
    Points
    19
    Par défaut
    ah oui en effet ca a l'air tout simple comme ca
    Je vais essayer merci

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 2
    Dernier message: 17/04/2008, 18h23
  2. Réponses: 0
    Dernier message: 25/07/2007, 14h47
  3. Membres statiques d'une classe et erreur de linkage
    Par Neilos dans le forum C++Builder
    Réponses: 10
    Dernier message: 09/02/2006, 23h06
  4. Réponses: 14
    Dernier message: 30/12/2005, 19h31
  5. membre statique dans une classe
    Par motrin dans le forum VB 6 et antérieur
    Réponses: 4
    Dernier message: 30/12/2005, 15h15

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo