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 :

Threads et C++


Sujet :

C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre Expert
    Avatar de coyotte507
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    1 327
    Détails du profil
    Informations personnelles :
    Âge : 35
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 1 327
    Par défaut Threads et C++
    Bonjour,

    Non je n'utilise pas boost.


    Je voulais savoir, lorsqu'on détruit un thread avec le méchant KillThread() d'une bibliothèque C, est-ce que les destructeurs ont le temps d'être appelé? Sinon je risque de me retrouver avec un problème avec les strings...

    De même, est-ce que si on appelle une fonction dans le thread, elle se termine même si on tue le thread? (Par exemple si je fais une fonction dangereuse du genre un string::swap(), y'a-t-il des risques?)

    Merci de votre aide

  2. #2
    Rédacteur/Modérateur
    Avatar de JolyLoic
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    5 463
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2004
    Messages : 5 463
    Par défaut
    KillThread n'est pas une fonction C standard, je ne sais pas de quelle bibliothèque elle vient. La réponse peut dépendre.

    Si elle est vraiment "méchante", la réponse est non : Tout s'arrête de suite, rien d'autre ne s'exécute. La mémoire n'est pas libérée, les mutex restent pris,... En général, si ton but n'est pas de quitter le programme juste après, tant pis pour toi.

    Après, il existe des fonction assassine qui au lieu d'y aller au bazooka utilise un poison lent, qui permet au thread en question de se rendre compte qu'il va mourir et de préparer sa succession (voire de prendre un antidote). Une possibilité pour ça est de générer une exception ou équivalent dans le thread en cours, ce signal remontant la pile d'appel et laissant donc un nettoyage se faire. La difficulté principale de cette méthode est de déterminer quand l'émission de cette exception peut se faire sans nuire au thread. Un problème connexe est qu'il est possible que le thread mettre très longtemps à mourir, voire refuse de le faire.
    Ma session aux Microsoft TechDays 2013 : Développer en natif avec C++11.
    Celle des Microsoft TechDays 2014 : Bonnes pratiques pour apprivoiser le C++11 avec Visual C++
    Et celle des Microsoft TechDays 2015 : Visual C++ 2015 : voyage à la découverte d'un nouveau monde
    Je donne des formations au C++ en entreprise, n'hésitez pas à me contacter.

  3. #3
    Membre émérite
    Avatar de Spout
    Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Février 2007
    Messages
    904
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Val d'Oise (Île de France)

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux

    Informations forums :
    Inscription : Février 2007
    Messages : 904
    Par défaut
    Je ne connais pas KillThread() non plus, mais TerminateThread() correspond exactement à la description de JolyLoic.

    Cf les remarques de TerminateThread() si cette fonction t'intéresse.

  4. #4
    Membre Expert
    Avatar de coyotte507
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    1 327
    Détails du profil
    Informations personnelles :
    Âge : 35
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 1 327
    Par défaut
    Merci pour vos réponses.

    En fait c'est la fonction SDL_KillThread de SDL, en téléchargeant le source j'ai vu:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    /* WARNING: This function is really a last resort.
     * Threads should be signaled and then exit by themselves.
     * TerminateThread() doesn't perform stack and DLL cleanup.
     */
    void SDL_SYS_KillThread(SDL_Thread *thread)
    {
    	TerminateThread(thread->handle, FALSE);
    }
    Voilà...
    En fait c'est TerminateThread, dans le lien donné par spoutspout il est dit:

    Citation Envoyé par MSDN
    TerminateThread is used to cause a thread to exit. When this occurs, the target thread has no chance to execute any user-mode code. DLLs attached to the thread are not notified that the thread is terminating. The system frees the thread's initial stack.
    Donc la pile est nettoyée, c'est déjà ça, mais je pense que je vais éviter au maximum de l'utiliser (juste un pointeur sur classe), quitte à faire un thread dans un autre pour gérer les mutex etc. proprement.

    Je n'ai pas très bien compris ce qui arrive avec les DLLs, est-ce que ça pose problème si j'utilise une fonction d'une DLL? Par exemple si j'utilise la fonction SDLNet_TCP_Send, qui est bloquante, et que je kill le thread, la fonction SDLNet_TCP_Send continuera de s'exécuter (car elle appartient à une DLL)??

    Je commence à avoir l'impression que je vais devoir totalement changer d'outils pour le réseau -- si les fonctions SDL Send et Recv peuvent bloquer longtemps -- car SDL_KillThread n'a pas l'air gentille du tout.

    Merci encore de votre aide,

    coyotte507

  5. #5
    Membre émérite
    Avatar de Spout
    Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Février 2007
    Messages
    904
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Val d'Oise (Île de France)

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux

    Informations forums :
    Inscription : Février 2007
    Messages : 904
    Par défaut
    Citation Envoyé par coyotte507 Voir le message
    Par exemple si j'utilise la fonction SDLNet_TCP_Send, qui est bloquante, et que je kill le thread, la fonction SDLNet_TCP_Send continuera de s'exécuter (car elle appartient à une DLL)??
    C'est exactement comme ça que je l'ai compris .

  6. #6
    Expert confirmé

    Homme Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Février 2007
    Messages
    4 253
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Février 2007
    Messages : 4 253
    Billets dans le blog
    3
    Par défaut
    Une fonction n'est pas un thread....

    Bloquant ca veut dire: "attend un signal d'un authre thread quelque part", c'est tout... si ton thread est dans la fonction SDLNet_TCP_Send, et que tu le tues, ben voilà, c'est tout, tu le tues... l'autre thread va bien envoyer son signal, mais y aura personne pour l'écouter.

  7. #7
    Rédacteur
    Avatar de 3DArchi
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    7 634
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 7 634
    Par défaut
    Je ne connait pas SDL mais quelques idées pour ton problème:
    -> Plutôt que d'utiliser un brutal KillThread tu peux mettre en place un mécanisme de demande de fermeture de ton thred. Celui-ci peut alors se terminer correctement. A toi de gérer les blocages.
    -> Plutôt que d'avoir des TCPSDLNet_TCP_Send/Rcv en mode bloquant, tu peux t'appuyer sur des sockets non bloquantes et utiliser le select et/ou des API spécifiques pour attendre (type WSAWaitForMultipleEvents sur Windows).

  8. #8
    Membre émérite
    Avatar de Spout
    Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Février 2007
    Messages
    904
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Val d'Oise (Île de France)

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux

    Informations forums :
    Inscription : Février 2007
    Messages : 904
    Par défaut
    Citation Envoyé par nicroman Voir le message
    Une fonction n'est pas un thread....

    Bloquant ca veut dire: "attend un signal d'un authre thread quelque part", c'est tout... si ton thread est dans la fonction SDLNet_TCP_Send, et que tu le tues, ben voilà, c'est tout, tu le tues... l'autre thread va bien envoyer son signal, mais y aura personne pour l'écouter.
    Si c'est le thread qui appelle la fonction dans la DLL, (l'exécution se trouve alors dans la DLL) et que le thread appelant est killé pendant ce temps là, la DLL n'est pas tenue au courant de la mort du thread et continue jusqu'au retour de la fonction de la DLL utilisée je suppose.
    D'où le problème si la fonction est bloquante (sans parler du timeout).

    Car un EXE/DLL et une autre DLL sont tout de même des "composants" différents qui vivent leur vie chacun de leur côté.

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

Discussions similaires

  1. Tri multi-threadé
    Par Tifauv' dans le forum C
    Réponses: 8
    Dernier message: 28/06/2007, 09h00
  2. récupérer la valeur de sortie d'un thread
    Par jakouz dans le forum Langage
    Réponses: 3
    Dernier message: 31/07/2002, 11h28
  3. Programmer des threads
    Par haypo dans le forum C
    Réponses: 6
    Dernier message: 02/07/2002, 13h53
  4. Réponses: 5
    Dernier message: 12/06/2002, 15h12
  5. [Kylix] Pb de Thread !!
    Par Anonymous dans le forum EDI
    Réponses: 1
    Dernier message: 25/04/2002, 13h53

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