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 :

multithread, singleton et exit


Sujet :

Threads & Processus C++

Vue hybride

Message pr�c�dent Message pr�c�dent   Message suivant Message suivant
  1. #1
    yan
    yan est d�connect�
    R�dacteur
    Avatar de yan
    Homme Profil pro
    Ing�nieur expert
    Inscrit en
    Mars 2004
    Messages
    10 035
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    �ge : 43
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activit� : Ing�nieur expert
    Secteur : High Tech - Multim�dia et Internet

    Informations forums :
    Inscription : Mars 2004
    Messages : 10 035
    Par d�faut multithread, singleton et exit
    Bonjour.
    j'ai une dll qui utilise un singleton pour manager des ressources. Ces ressources instancient des std::thread, std::mutex et std::shared_mutex.

    Le singleton est instanci� lors de l'appel � une fonction static

    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    class singleton
    {
    public
        static singleton &current()
       {
            static singleton _singl;
            return _singl
       }
    };
    Malheureusement, ceci pose probl�me si un utilisateur appel la m�thode exit().

    Lors de l'appel � exit, la destruction du singleton crash car les thread se sont arr�t�s sans lib�rer les mutex.
    La seule mani�re que j'ai trouv�e est de modifier l'instanciation du singleton en utilisant un pointeur et d'ajout� une fonction pour le d�truire(doit �tre appel� par l'utilisateur avant de sortir du main). Mais lors d'un exit rien n'est lib�r� proprement.

    Y a t'il une possibilit� d�emp�cher l�arr�t brutale des thread lors de l'appel � un exit et de pouvoir lib�rer proprement les donn�es de ma dll?

    merci,
    Yan

  2. #2
    Membre Expert
    Avatar de Pyramidev
    Homme Profil pro
    Tech Lead
    Inscrit en
    Avril 2016
    Messages
    1 513
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyr�n�es)

    Informations professionnelles :
    Activit� : Tech Lead

    Informations forums :
    Inscription : Avril 2016
    Messages : 1 513
    Par d�faut
    Bonjour,

    La solution est probablement de remplacer l'appel de exit par le lancement d'une exception.
    Si le code utilise correctement le RAII, alors les ressources seront lib�r�es au fur et � mesure que l'on remonte dans la pile.

  3. #3
    Mod�rateur

    Avatar de Bktero
    Homme Profil pro
    Ing�nieur d�veloppement logiciels
    Inscrit en
    Juin 2009
    Messages
    4 493
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    �ge : 38
    Localisation : France, Loire Atlantique (Pays de la Loire)

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

    Informations forums :
    Inscription : Juin 2009
    Messages : 4 493
    Billets dans le blog
    1
    Par d�faut
    Est-ce que atexit() pourrait te permettre d'enregistrer une fonction pour g�rer ce cas ?

    http://man7.org/linux/man-pages/man3/atexit.3.html

  4. #4
    yan
    yan est d�connect�
    R�dacteur
    Avatar de yan
    Homme Profil pro
    Ing�nieur expert
    Inscrit en
    Mars 2004
    Messages
    10 035
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    �ge : 43
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activit� : Ing�nieur expert
    Secteur : High Tech - Multim�dia et Internet

    Informations forums :
    Inscription : Mars 2004
    Messages : 10 035
    Par d�faut
    Citation Envoy� par Pyramidev Voir le message
    Bonjour,

    La solution est probablement de remplacer l'appel de exit par le lancement d'une exception.
    Si le code utilise correctement le RAII, alors les ressources seront lib�r�es au fur et � mesure que l'on remonte dans la pile.
    Je n'ai pas vraiment la main sur ces parties de code :/. Mais �a serait plus propre.


    Citation Envoy� par Bktero Voir le message
    Est-ce que atexit() pourrait te permettre d'enregistrer une fonction pour g�rer ce cas ?

    http://man7.org/linux/man-pages/man3/atexit.3.html
    Cette fonction est appel�e apr�s l�arr�t des thread :/


    merci

  5. #5
    Expert confirm�
    Homme Profil pro
    D�veloppeur informatique
    Inscrit en
    F�vrier 2005
    Messages
    5 505
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    �ge : 53
    Localisation : France, Val de Marne (�le de France)

    Informations professionnelles :
    Activit� : D�veloppeur informatique
    Secteur : Conseil

    Informations forums :
    Inscription : F�vrier 2005
    Messages : 5 505
    Par d�faut
    Il est tr�s commun de demander � l'utilisateur d'une librairie d'appeler une m�thode avant toute demande, comme le CoInitialize() de COM, et apr�s la derni�re demande comme CoUninitialize() de COM.
    Donc pourquoi ne pas demander au code utilisateur de votre biblioth�que de faire de m�me ?

    L'utilisation de la fonction DllMain ne permet-elle pas un repli en bonne ordre ?

    Apr�s, il reste toujours les m�thodes de bourrins, � la virus, qui est de d�router l'IAT de "exit" du programme pour que votre Dll prennent la main, mais bon, on peut commencer par gentiment demander � l'utilisateur de ne pas faire n'importe quoi, avant de sortie la bombe atomique.

  6. #6
    yan
    yan est d�connect�
    R�dacteur
    Avatar de yan
    Homme Profil pro
    Ing�nieur expert
    Inscrit en
    Mars 2004
    Messages
    10 035
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    �ge : 43
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activit� : Ing�nieur expert
    Secteur : High Tech - Multim�dia et Internet

    Informations forums :
    Inscription : Mars 2004
    Messages : 10 035
    Par d�faut
    Citation Envoy� par bacelar Voir le message
    L'utilisation de la fonction DllMain ne permet-elle pas un repli en bonne ordre ?
    ben non car il y a des choses que l'on ne dois pas faire dans dllmain et pas forcement appel� lors de la sortie du process.

    Donc pourquoi ne pas demander au code utilisateur de votre biblioth�que de faire de m�me ?
    En faite j'ai une fonction qui nettoie les ressources allou�es � appeler avant le return du main.
    Mais je ne m'attendais pas � ce que exit(appel� par une autre lib...) pose probl�me.
    Au finale, je n'avais pas pens� que lors de l'appel � un exit, les thread sont arr�t�s automatiquement par le syst�me et peut laisser des mutex bloqu� et donc ne plus pouvoir d�sallouer certaines classe constitu�es de std::thread ,std::mutex,...

    Et donc devoir g�rer le singleton diff�remment que

    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    class singleton
    {
    public
        static singleton &current()
       {
            static singleton _singl;
            return _singl
       }
    };
    pour avoir des cas o� on ne le d�truit pas.

+ R�pondre � la discussion
Cette discussion est r�solue.

Discussions similaires

  1. Singleton et multithread
    Par totoche dans le forum Servlets/JSP
    R�ponses: 2
    Dernier message: 25/05/2010, 18h05
  2. [Singleton] singleton et multithreading
    Par behess dans le forum Design Patterns
    R�ponses: 17
    Dernier message: 24/09/2009, 18h33
  3. Singleton et Multithreading
    Par behess dans le forum C#
    R�ponses: 22
    Dernier message: 09/09/2009, 11h09
  4. Singleton et multithreading
    Par Alp dans le forum C++
    R�ponses: 17
    Dernier message: 06/08/2006, 02h49

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