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

C++ Discussion :

[win32/c++] pattern singleton et double check


Sujet :

C++

  1. #1
    Expert confirmé

    Profil pro
    Inscrit en
    Février 2006
    Messages
    2 382
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 2 382
    Points : 4 939
    Points
    4 939
    Par défaut [win32/c++] pattern singleton et double check
    bonsoir, petite question qui me taraude l'esprit, est ce qu'on ne pourrait pas résoudre le problème du double check de (http://come-david.developpez.com/tut...page=Singleton) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    template <class T>  T* Singleton<T>::Get()
    {
        if(m_i==0) //Premier check
        {
            Lock lock
            if(m_i==0) //Second
            {
                m_i=new T();
            }
        }
        return m_i;
    }
    avec :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    template <class T>  T* Singleton<T>::Get()
    {
        if(m_i==0) //Premier check
        {
            Lock lock
            if(m_i==0) //Second
            {
                InterlockedExchangePointer(&m_i, new T());
            }
        }
        return m_i;
    }
    bien sur uniquement sous windows, mais bon je me pose la question.

  2. #2
    Membre expert Avatar de jabbounet
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Juin 2009
    Messages
    1 909
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48

    Informations professionnelles :
    Activité : Consultant informatique

    Informations forums :
    Inscription : Juin 2009
    Messages : 1 909
    Points : 3 284
    Points
    3 284
    Par défaut
    dans un contexte d'application multithreadé.

    Oui en revanant au cas du simple check, mais tu pose un lock pour te protéger des accès concurents à chaque fois que tu souhaite récuperer ton singleton .

    La solution du double check t'évite de poser un lock une fois que tu es certain que ton singleton est crée (m_i != 0).

    Verifier que m_i != 0 est beacoup moins couteux que de poser un lock systématiquement.
    bazar: http://www.improetcompagnie.com/publ...ctacles-6.html

    BÉPO la disposition de clavier francophone, ergonomique et libre: http://bepo.fr/wiki/Accueil

    Emacs Wiki: http://www.emacswiki.org/

    En attente de ce que produira: http://www.pushmid.com

  3. #3
    En attente de confirmation mail

    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Août 2004
    Messages
    1 391
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : France, Doubs (Franche Comté)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Août 2004
    Messages : 1 391
    Points : 3 311
    Points
    3 311
    Par défaut
    @jabbounet: Je crois pas qu'il parle de remplacer le DCLP, mais de corriger son problème. (cf article de David)

    Je ne sais pas exactement ce que fait cette méthode spécifique, mais si elle fait un echange de pointeur en situation MT alors non ce n'est pas suffisant, il me semble que le compilateur pourra toujours intervertir les opérations et donc on retrouve le problème de base.

    Alexandrescu et Meyers ont écrit un article sur le sujet (il faut voir sur le site de Meyers ou Dr Dobbs), la conclusion qu'ils font est qu'il n'existe pas de solution réel au problème. Ce qui a le plus de chance de marcher est d'utiliser des objet déclaré virtual, mais ca peut toujours échouer. Et une autre solution non portable qu'il évoque et l'utilisation de Barrière Mémoire, mais il ne donne pas plus d'info là-dessus. (si la fonction que tu utilises est de ce type alors oui ca marche)

  4. #4
    Expert confirmé

    Profil pro
    Inscrit en
    Février 2006
    Messages
    2 382
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 2 382
    Points : 4 939
    Points
    4 939
    Par défaut
    oui dans un contexte multithread, c'est un oublie de ma part, et oui "corriger" le problème, enfin c'est vite dit mais bon.

    alors InterlockedExchangePointer :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    PVOID __cdecl InterlockedExchangePointer(
      __inout  PVOID volatile *Target,
      __in     PVOID Value
    );
    stocke de manière atomique le second argument dans le premier.

    et puis je me suis rappelé que justement comme le reprécise Flob90, le compilateur peut changer l'ordre des instructions, voilà d'où vient cette idée.

  5. #5
    Membre émérite
    Avatar de white_tentacle
    Profil pro
    Inscrit en
    Novembre 2008
    Messages
    1 505
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2008
    Messages : 1 505
    Points : 2 799
    Points
    2 799
    Par défaut
    Le problème c'est qu'InterlockedExchangedPointer est dépendante de ton modèle mémoire, et que je ne suis pas sûr qu'elle existe partout.

    Le double-checked singleton pattern marche sur certaines architectures, pas d'autres. Sur celles-ci, pas vraiment d'autre choix que de locker pour de vrai à chaque fois. Et peu de cas où ce sera vraiment un problème (si ça l'est, la fonction d'initialisation appelée au début du programme est probablement la solution à envisager).

  6. #6
    En attente de confirmation mail

    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Août 2004
    Messages
    1 391
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : France, Doubs (Franche Comté)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Août 2004
    Messages : 1 391
    Points : 3 311
    Points
    3 311
    Par défaut
    Le double-checked singleton pattern marche sur certaines architectures, pas d'autres.
    De mémoire le problème incombe au compilateur pas à l'architecture en elle même, et comme le compilateur est libre de faire ce qu'il veut le problème est réel.

    Sur celles-ci, pas vraiment d'autre choix que de locker pour de vrai à chaque fois.
    Mieux vaut créer le singleton dans un portion mono-thread (qaund on est sur qu'il n'y aura pas d'acces simultané) du programme alors :p

    Et peu de cas où ce sera vraiment un problème
    En réalité ca pose problème une seul fois : lors de la création du singleton, mais ca reste un problème. (Le résultat du problème est quand même un pointeur non initialisé, ce n'est pas anodin)

  7. #7
    Membre émérite
    Avatar de white_tentacle
    Profil pro
    Inscrit en
    Novembre 2008
    Messages
    1 505
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2008
    Messages : 1 505
    Points : 2 799
    Points
    2 799
    Par défaut
    Citation Envoyé par Flob90 Voir le message
    En réalité ca pose problème une seul fois : lors de la création du singleton, mais ca reste un problème. (Le résultat du problème est quand même un pointeur non initialisé, ce n'est pas anodin)
    Je parlais du problème de perf induit par le lock à chaque accès, qui n'en est que très rarement un . Le fait que le programme puisse planter, même si c'est rarissime, n'est pas un problème que je considère négligeable.

  8. #8
    En attente de confirmation mail

    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Août 2004
    Messages
    1 391
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : France, Doubs (Franche Comté)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Août 2004
    Messages : 1 391
    Points : 3 311
    Points
    3 311
    Par défaut
    Citation Envoyé par white_tentacle Voir le message
    Je parlais du problème de perf induit par le lock à chaque accès, qui n'en est que très rarement un
    J'avais compris à l'envers

    Je croyais que le lock systématique réduisait vraiment les perf, ce n'est pas le cas ? Tu as un bench sur les pref des mutexes ? J'était persuadé que c'était une opération couteuse

  9. #9
    Membre expert Avatar de jabbounet
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Juin 2009
    Messages
    1 909
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48

    Informations professionnelles :
    Activité : Consultant informatique

    Informations forums :
    Inscription : Juin 2009
    Messages : 1 909
    Points : 3 284
    Points
    3 284
    Par défaut
    Citation Envoyé par Flob90 Voir le message
    J'avais compris à l'envers

    Je croyais que le lock systématique réduisait vraiment les perf, ce n'est pas le cas ? Tu as un bench sur les pref des mutexes ? J'était persuadé que c'était une opération couteuse
    Tout dépend des accès que tu fait sur le lock et la section critique associé en fait.

    En gros plus le lock est sollicité et plus la section critique est longue a s'executer plus les perf vont réduire (logique). si cela deviens problématique pour les perfs de ton application un redesign de cette partie peu etre à envisager.

    Maintenant si ton lock/ta section critique est accédé un fois par heure par 4 threads et que le temps moyen d'execution de ta section critique est de 10 ms aucune chance que tu ai des problèmes de perf de ce coté là.
    bazar: http://www.improetcompagnie.com/publ...ctacles-6.html

    BÉPO la disposition de clavier francophone, ergonomique et libre: http://bepo.fr/wiki/Accueil

    Emacs Wiki: http://www.emacswiki.org/

    En attente de ce que produira: http://www.pushmid.com

  10. #10
    En attente de confirmation mail

    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Août 2004
    Messages
    1 391
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : France, Doubs (Franche Comté)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Août 2004
    Messages : 1 391
    Points : 3 311
    Points
    3 311
    Par défaut
    Pour la longueur de la section critique qui réduit les perf ca me parait assez logique. C'est le lock (disons d'un mutexe classique) en lui même que je croyait non performant.

    C'est d'ailleurs la raison invoqué (l'inneficasité des lock) par Alexandrescu dans MC++D pour ne pas utiliser un Lock simple mais le DCLP.

  11. #11
    Expert éminent sénior
    Avatar de Luc Hermitte
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2003
    Messages
    5 275
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Août 2003
    Messages : 5 275
    Points : 10 985
    Points
    10 985
    Par défaut
    L'autre jour, je suis tombé sur ces infos relativement aux singletons en situation MT.
    J'avoue avoir été surpris par diverses choses (que je n'ai pas encore pris le temps de contrôler)
    Blog|FAQ C++|FAQ fclc++|FAQ Comeau|FAQ C++lite|FAQ BS|Bons livres sur le C++
    Les MP ne sont pas une hotline. Je ne réponds à aucune question technique par le biais de ce média. Et de toutes façons, ma BAL sur dvpz est pleine...

  12. #12
    En attente de confirmation mail

    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Août 2004
    Messages
    1 391
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : France, Doubs (Franche Comté)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Août 2004
    Messages : 1 391
    Points : 3 311
    Points
    3 311
    Par défaut
    Je suis pas certain d'avoir tout compris. Mais l'existence de fonction Compare en Swap atomique à l'air d'être vraiment une solution interresente à voir si il ne reste aucun autre problème.

  13. #13
    Membre expert Avatar de jabbounet
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Juin 2009
    Messages
    1 909
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48

    Informations professionnelles :
    Activité : Consultant informatique

    Informations forums :
    Inscription : Juin 2009
    Messages : 1 909
    Points : 3 284
    Points
    3 284
    Par défaut
    Citation Envoyé par Flob90 Voir le message
    Je suis pas certain d'avoir tout compris. Mais l'existence de fonction Compare en Swap atomique à l'air d'être vraiment une solution interresente à voir si il ne reste aucun autre problème.
    oui CAS est interessant surtout pour les structure lockfree, mais je ne l'ai pas encore rencontré dans la pratique.
    bazar: http://www.improetcompagnie.com/publ...ctacles-6.html

    BÉPO la disposition de clavier francophone, ergonomique et libre: http://bepo.fr/wiki/Accueil

    Emacs Wiki: http://www.emacswiki.org/

    En attente de ce que produira: http://www.pushmid.com

Discussions similaires

  1. Pattern singleton en asp.net
    Par tortuegenie dans le forum ASP.NET
    Réponses: 6
    Dernier message: 24/06/2008, 11h47
  2. Implémentation du design pattern singleton
    Par 0pierrot0 dans le forum C++
    Réponses: 1
    Dernier message: 22/01/2008, 10h01
  3. Source Pattern Singleton
    Par Drikcé dans le forum Langage
    Réponses: 5
    Dernier message: 30/10/2007, 15h22
  4. Pattern singleton ou Classe avec méthodes statiques ?
    Par Claythest dans le forum Langage
    Réponses: 3
    Dernier message: 11/12/2006, 11h28
  5. [Débutant] pattern singleton
    Par SirDarken dans le forum Débuter avec Java
    Réponses: 22
    Dernier message: 11/12/2004, 01h55

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