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 :

singleton thread safe


Sujet :

Threads & Processus C++

  1. #1
    r0d
    r0d est déconnecté
    Membre expérimenté

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    4 288
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Août 2004
    Messages : 4 288
    Billets dans le blog
    2
    Par défaut singleton thread safe
    Bonjour,

    j'ai du mal à comprendre les problèmes de concurrence posés par le pattern singleton. Par exemple, je ne comprend rien à ce papier: http://www.aristeia.com/Papers/DDJ_J...04_revised.pdf

    Ne suffit-il pas de protéger l'accesseur à l'instance unique pour que notre singleton soit thread safe? Par exemple, le singleton suivant est-il thread safe:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    static Singleton* GetInstance()
    {
    	boost::mutex::scoped_lock lock(my_mutex);
    	if ( instance == nullptr )
    		intance = new Singleton();
    	return instance;
    }

  2. #2
    Membre Expert

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2007
    Messages
    1 895
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Septembre 2007
    Messages : 1 895
    Par défaut
    Citation Envoyé par r0d Voir le message
    Bonjour,

    j'ai du mal à comprendre les problèmes de concurrence posés par le pattern singleton. Par exemple, je ne comprend rien à ce papier: http://www.aristeia.com/Papers/DDJ_J...04_revised.pdf

    Ne suffit-il pas de protéger l'accesseur à l'instance unique pour que notre singleton soit thread safe? Par exemple, le singleton suivant est-il thread safe:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    static Singleton* GetInstance()
    {
    	boost::mutex::scoped_lock lock(my_mutex);
    	if ( instance == nullptr )
    		intance = new Singleton();
    	return instance;
    }
    Là, tu protèges la création et l'accès à la ressource, pas son utilisation. Le singleton lui même n'est toujours pas thread safe.

    Un singleton thread-safe a un second mutex à l'intérieur du singleton lui-même.

    Le papier de Myers dit que ton code est tout à fait valide, cependant la protéction qu'il met en oeuvre est coûteuse. Une fois le singleton créé, il n'y a plus lieu de locker le mutex, parce que - le singleton existant - le même pointeur sera toujours retourné. Du coup, tu va locker pour rien (et un lock, c'est tout sauf gratuit).

    Le reste du papier décrit pourquoi il est difficile d'écrire une implémentation valide et complètement correcte de l'instanciation d'un singleton qui ne soit pas diminué par un lock inutile (utilisation du "lock doublement vérifié").
    [FAQ des forums][FAQ Développement 2D, 3D et Jeux][Si vous ne savez pas ou vous en êtes...]
    Essayez d'écrire clairement (c'est à dire avec des mots français complets). SMS est votre ennemi.
    Evitez les arguments inutiles - DirectMachin vs. OpenTruc ou G++ vs. Café. C'est dépassé tout ça.
    Et si vous êtes sages, vous aurez peut être vous aussi la chance de passer à la télé. Ou pas.

    Ce site contient un forum d'entraide gratuit. Il ne s'use que si l'on ne s'en sert pas.

  3. #3
    Expert confirmé
    Avatar de Luc Hermitte
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2003
    Messages
    5 292
    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 292
    Par défaut
    Le C++11 va nous permettre d'avoir des singletons thread-safe, robustes et rapides.
    La façon la plus simple d'y parvenir, c'est avec le modèle énoncé par Scott Meyers dans son Effective C++ : avec une variable locale statique. Depuis le C++11, ce sera thread-safe.
    Par contre, ce singleton là ne permet pas de contrôler finement le moment de sa libération.

    En vrac, quelques liens que j'ai collectés sur le sujet. Je n'ai pas encore pris le temps de les trier ni d'évaluer si toutes les solutions données étaient valables.
    - http://stackoverflow.com/questions/6...ngleton-in-c11
    - http://stackoverflow.com/questions/1...design-pattern
    - http://www.athile.net/library/wiki/i...sing_C%2B%2B0x
    - http://www.1024cores.net/home/lock-f...initialization
    - http://stackoverflow.com/questions/6...singleton-in-c
    - http://www.justsoftwaresolutions.co....d-locking.html
    - http://silviuardelean.ro/2012/06/05/...on-approaches/

    (je te passe les liens qui remettent les singletons à leur place de variable globale vu que ce n'est pas le sujet ici)
    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...

  4. #4
    r0d
    r0d est déconnecté
    Membre expérimenté

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    4 288
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Août 2004
    Messages : 4 288
    Billets dans le blog
    2
    Par défaut
    Merci Luc

  5. #5
    Membre confirmé
    Inscrit en
    Juin 2008
    Messages
    140
    Détails du profil
    Informations forums :
    Inscription : Juin 2008
    Messages : 140
    Par défaut
    Bonjour,
    qu'en est-il de ce qui est expliqué ici ?
    J'avais eu l'impression (à l'époque où je me suis intéressé à ce design pattern) que les solutions proposées étaient correctes.

  6. #6
    Membre Expert

    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 : 34
    Localisation : France, Doubs (Franche Comté)

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

    Informations forums :
    Inscription : Août 2004
    Messages : 1 391
    Par défaut
    http://come-david.developpez.com/tut...ngleton#L4-a-3

    David dit bien qu'en MT c'est complexe. Et à l'époque où il a écrit ca, le C++11 n'existait pas; rendant les solutions au problème assez complexe.

Discussions similaires

  1. [RCP] Treeviewer non thread-safe ?
    Par Guildux dans le forum Eclipse Platform
    Réponses: 4
    Dernier message: 09/01/2007, 13h00
  2. fonction de stdio.h thread safe ??
    Par boolzor dans le forum POSIX
    Réponses: 3
    Dernier message: 30/04/2006, 20h03
  3. Code "Thread Safe" ?
    Par Neitsa dans le forum C++
    Réponses: 3
    Dernier message: 23/12/2005, 14h33
  4. [Language]Immutable & Thread-Safe
    Par Repti dans le forum Concurrence et multi-thread
    Réponses: 4
    Dernier message: 21/12/2005, 15h50
  5. [MFC] CMAP non thread safe ?
    Par fmarot dans le forum MFC
    Réponses: 5
    Dernier message: 04/10/2005, 13h21

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