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 :

Problème pour terminer un thread


Sujet :

Threads & Processus C++

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    24
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2007
    Messages : 24
    Points : 15
    Points
    15
    Par défaut Problème pour terminer un thread
    Salut,

    Je vous explique la situation : j'ai un thread qui est en attente sur un Read de socket. Je passe par un select pour gérer un timeout.
    De temps en temps, j'ai besoin de terminer ce thread. J'avais tout d'abord essayer de le faire se terminer normalement en simulant une déconnexion du client (en fermant la socket) ; mais pour je ne sais quelle raison, lorsque je ferme sa socket, il ne sort pas du select.

    J'ai donc cherché du côté de pthread_cancel. Mais alors là, j'ai des bugs que je ne comprends pas.
    Une fois mon thread lancé, je lui mets l'état "PTHREAD_CANCEL_ASYNCHRONOUS" qui permet de terminer le thread instantanément après l'appel de pthread_cancel (lorsque je suis dans des sections critiques, je fais tout simplement un "PTHREAD_CANCEL_DISABLE").
    Donc dans 99% du temps, mon thread peut être terminé à tout moment. Maintenant lorsque je fais un appel à pthread_cancel, j'ai une exception qui part et que je ne peux rattraper avec rien d'autre que "...". Le problème c'est que si je ne relance pas cette exception j'ai un Abort avec "FATAL: exception not rethrown" et si je relance l'exception (ou si tout simplement je ne la catch pas), j'ai un Abort avec "terminate called without an active exception".

    J'ai essayé pas mal d'autres choses, comme faire un pthread_exit(0) dans mon catch mais ceci fait crasher l'application aussi.
    J'ai fait pas mal de recherches, mais là je ne comprends pas ce qu'il se passe.

    Voilà, si quelqu'un pourrait m'apporter des informations concernant ce problème ?

    Merci ^^

  2. #2
    Alp
    Alp est déconnecté
    Expert éminent sénior

    Avatar de Alp
    Homme Profil pro
    Inscrit en
    Juin 2005
    Messages
    8 575
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Juin 2005
    Messages : 8 575
    Points : 11 860
    Points
    11 860
    Par défaut
    Il n'y a pas une fonction pthread_close ?

  3. #3
    Membre à l'essai
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    24
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2007
    Messages : 24
    Points : 15
    Points
    15
    Par défaut
    Non pas que je sache, en tout cas man pthread_close ne trouve rien.

  4. #4
    Expert confirmé
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Décembre 2003
    Messages
    3 549
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

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

    Informations forums :
    Inscription : Décembre 2003
    Messages : 3 549
    Points : 4 625
    Points
    4 625
    Par défaut
    L'annulation de thread pose de nombreux problèmes.
    Il vaut mieux faire sans.
    Boost ftw

  5. #5
    Membre à l'essai
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    24
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2007
    Messages : 24
    Points : 15
    Points
    15
    Par défaut
    Ah, je me disais que l'effet que j'avais été quand même assez incompréhensible ^^;

    Est-ce que tu pourrais m'indiquer une solution pour stopper mon thread ?

    Comme je le disais, le plus souvent il est bloqué dans un select qui sera suivi d'un Read. Mais je ne sais pas comment le faire sortir du select pour le terminer ensuite (vu que le fait de fermer la socket ne le fait pas sortir du select).

  6. #6
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 287
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 287
    Points : 36 776
    Points
    36 776
    Par défaut
    Il y a (en général) des incompatibilités entre les threads et les mécanismes d'exceptions de C++.
    Evitez PTHREAD_CANCEL_ASYNCHRONOUS pour PTHREAD_CANCEL_DEFERRED.

    Le select n'est pas "a cancellation point", je ne sais pas combien de secondes vous attendez mais il va peut être falloir les fragmenter (faire 10 appels à select de 1s plutôt qu'un seul appel avec un timeout de 10s).

    - W.
    PS: write suivi de shutdown devrait décoincer aussi le select.
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  7. #7
    Membre à l'essai
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    24
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2007
    Messages : 24
    Points : 15
    Points
    15
    Par défaut
    Merci beaucoup wiztricks, le shutdown a en effet permis de sortir du select et donc de terminer le thread normalement, sans utiliser le pthread_cancel ^^

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

Discussions similaires

  1. Problème pour générer un thread
    Par siro75 dans le forum Bibliothèques, systèmes et outils
    Réponses: 3
    Dernier message: 29/01/2014, 15h16
  2. [Pascal / SDL] Problème pour gérer les Threads…
    Par Sn00ze92 dans le forum Langage
    Réponses: 2
    Dernier message: 24/02/2009, 17h40
  3. Problème pour tuer un Thread
    Par demcoul dans le forum Concurrence et multi-thread
    Réponses: 5
    Dernier message: 29/12/2008, 19h31
  4. Probléme pour tuer un Thread
    Par peyo_le_fou dans le forum POSIX
    Réponses: 5
    Dernier message: 04/11/2006, 14h10
  5. Thread problème pour l'arreter
    Par rvzip64 dans le forum Langage
    Réponses: 8
    Dernier message: 12/07/2005, 10h51

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