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 :

Arrêt instantané d'un thread.


Sujet :

Threads & Processus C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Inscrit en
    Décembre 2003
    Messages
    87
    Détails du profil
    Informations forums :
    Inscription : Décembre 2003
    Messages : 87
    Par défaut Arrêt instantané d'un thread.
    Bonjour,

    Mon problème est le suivant. Je veux arrêter tous les threads de mon application (c++ sous linux utilisant pthread) rapidement même si ces derniers sont en train de faire un sleep, d'attendre une condition (pthread_cond_wait) ou d'essayer de lire dans un socket avec un timeout.

    Si je teste une condition de fin dans la boucle principale du thread je dois attendre que toutes les opérations bloquantes soient terminées même si ce n'est pas utile avant que le thread s'arrête.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    while(!shutdownRequested)
    {
       // Attends 10 secondes avant de s'arrêter.
       sleep(10);
    }
    J'ai essayé d'utiliser pthread_cancel mais dans ce cas la je reçois une exception inconnue et mon programme ne se termine pas correctement avec le message :
    FATAL: exception not rethrown
    J'ai lu sur plusieur sites qu'il est fortement déconseillé d'utiliser pthread_cancel() dans un programme C++.
    Ma question est donc la suivante : Comment annuler proprement et instantanément l'exécution d'un thread en C++?

  2. #2
    Membre émérite
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    780
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Mai 2006
    Messages : 780
    Par défaut
    bon j'avais fait une grosse réponse sur comment on pouvait faire ça avec boost:thread par exemple et les interruption points mais je crois que ça revient à tester tes conditions avec pthread?

    Le truc c'est que si tu veux que ça soit sécurisé et pas à l'arrache, il va falloir que ça soit toi qui dises où est-ce qu'on peut s'arrêter en sécurité.

    Dans boost il y a les boost::this_thread::sleep et interruption_point qui, si on appelle un thread.interrupt dans le code qui a créé le thread (qui a un objet de type thread), ben ça va générer une exception aux points d'interruptions choisis quand on y passe.

    Et tu peux catcher cette exception et sortir proprement C++ style en fermant tout comme il faut. Et dans le code qui appelle interrupt, on fait un join et voilà.

    Mais arrêter à l'arrache, ça peut t'amener des soucis.

  3. #3
    Membre confirmé
    Inscrit en
    Décembre 2003
    Messages
    87
    Détails du profil
    Informations forums :
    Inscription : Décembre 2003
    Messages : 87
    Par défaut
    Finalement j'ai utilisé un signaux linux (SIGUSR1) que j'envoie aux threads. Quand les threads le reçoivent je génère une exception que je catch pour tout nettoyer proprement avant d’arrêter mon thread.

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

Discussions similaires

  1. Réponses: 1
    Dernier message: 04/06/2012, 16h10
  2. arrêt brutal d'un thread
    Par locus dans le forum Threads & Processus
    Réponses: 4
    Dernier message: 08/12/2011, 18h29
  3. Réponses: 2
    Dernier message: 05/03/2007, 16h45
  4. Réponses: 7
    Dernier message: 18/09/2006, 22h01
  5. Arrêt de thread
    Par mr.saucisse dans le forum MFC
    Réponses: 5
    Dernier message: 29/01/2006, 21h02

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