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 512
    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 512
    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 : 37
    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 461
    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 461
    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