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

POSIX C Discussion :

démarrer / arrêter un thread


Sujet :

POSIX C

  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    613
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2007
    Messages : 613
    Points : 406
    Points
    406
    Par défaut démarrer / arrêter un thread
    Bonjour,

    Je dois créer un thread qui peut soit s'arrêter de lui même, soit s'arrêter si on lui demande.

    Donc je lui transmet l'adresse d'une variable que je peut modifier dans mon programme principal, et quand je met cette variable à 0, le thread quitte.

    En quittant le thread met la variable à 0 avant de quitter pour indiquer qu'il ne tourne plus, au cas où il aurait quitté de lui même.

    Lorsque je dois lancer ce thread je vérifie que la variable est à 0 car je ne veux pas en avoir deux en même temps.

    Mon problème :
    * Si je demande au thread de s'arrêter (var <- 0) et que je veux en lancer un autre trop vite, alors le thread qui était en train de quitter va remettre var à 0 en quittant alors que je l'avais remis à 1 pour le nouveau thread, qui va donc quitter lui aussi.
    Il peut aussi se poser le problème qu'en remettant la variable à 1 pour le nouveau thread, l'ancien thread n'ai pas eu le temps de voir que var a été mis à 0 pour qu'il quitte, et je me retrouve avec 2 thread.


    Avez vous une solution à me proposer?

    merci

  2. #2
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 369
    Points : 41 519
    Points
    41 519
    Par défaut
    Tu peux attendre spécifiquement que le thread ait quitté avant de lancer le nouveau, non?
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    613
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2007
    Messages : 613
    Points : 406
    Points
    406
    Par défaut
    Non car je voudrais le relancer seulement si il n'y en a pas déjà un.

    Ou alors il faudrait que je mette var à 0 quand je veux l'arrêter, et quand je veux en relancer un, vérifier qu'il a bien finit de quitter ?
    Comment on fait ça?

  4. #4
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 369
    Points : 41 519
    Points
    41 519
    Par défaut
    Ce que je te conseille, c'est systématiquement, quand tu mets var à zéro, attendre que le thread ait vraiment quitté.
    Je crois que tu peux faire ça avec pthread_join()...
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  5. #5
    Membre averti
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    613
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2007
    Messages : 613
    Points : 406
    Points
    406
    Par défaut
    ça je ne peut car c'est fait dans une grosse application qui ne peut pas attendre la fin du thread pour continuer à faire le reste.

    De plus je l'ai créé avec l'attribut PTHREAD_CREATE_DETACHED donc je ne peut pas utiliser join()

  6. #6
    Membre averti
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    613
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2007
    Messages : 613
    Points : 406
    Points
    406
    Par défaut
    J'ai un début de solution qui fait un peu uzine à gaz et en plus il y à toujours un cas où ça peut ne pas marcher.
    Donc si quelqu'un a une autre idée, ou voit comment améliorer cette solution ?


    Une variable flag avec 4 états possibles :
    0 : pas de thread en cours
    1 : thread en cours
    2 : demande d'arrêt du thread, ou en cours d'arrêt spontané
    3 : en cours d'arrêt, et demande de reprise;

    Le thread boucle tant que Flag est à 1 ou qu'il doit quitter de lui même.
    Lorsque le thread se finit il positionne lui même le flag à 0.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
     
     
    Pour démarrer le thread
    Si Flag == 0
    	Flag = 1
    	Demarrer thread
    Si Flag == 2
    	Flag = 3
    	Tant que Flag == 3
    		Attendre
    	Si Flag == 0
    		Flag = 1
    		Démarrer thread
     
    Pour arrêter le thread :
    si Flag == 1 ou Flag == 3
    	Flag = 2
    Grâce à ça je résoud un certain nombre de cas comme par exemple le fait qu'on ne peut pas demander deux fois la démarage du thread grace à la valeur 3 du flag qui indique qu'on est déjà en train d'attendre la fin pour le relancer.

    Mais il reste toujours un cas où ca ne marche pas :
    - Un thread est en train de se finir et on attends pour le relancer (donc Flag est à 3)
    - On veut de nouveau tout arrêter, donc on remet flag à 2 pour pas que le nouveau se lance

    Dans ce cas, si Attendre se finit là et voit le flag à 2 il ne va pas le relancer.
    Mais si entre temps le thread qui était en train de se terminer remet le Flag à 0, la fonction qui devait relancer le thread n'aura pas vu que Flag était repassé à 2.

  7. #7
    Membre du Club
    Profil pro
    Étudiant
    Inscrit en
    Décembre 2009
    Messages
    67
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2009
    Messages : 67
    Points : 67
    Points
    67
    Par défaut
    Une autre solution serez d'ajouter un verrou à l endroit ou tu changes la valeur de var, ainsi le thread qui va se lancer attendra de lui meme que le thread terminant son execution est quitté l endroit.

    on appelle ca la synchronisation voici un petit tuto
    http://rom.developpez.com/java-synchronisation/

    (je sais que j ai deterré un vieu topic, mais aucunes réponses correctes à été proposé alors ... )

Discussions similaires

  1. [Threads] Démarrer et arrêter un Thread
    Par Nico_stras dans le forum C#
    Réponses: 4
    Dernier message: 20/08/2008, 17h02
  2. Executer un fichier .bat sur commande Démarrer/Arrêter
    Par loïc.rio dans le forum Windows
    Réponses: 5
    Dernier message: 10/05/2006, 16h18
  3. [Thread] arrêter un thread
    Par melvar dans le forum Concurrence et multi-thread
    Réponses: 4
    Dernier message: 10/04/2006, 18h06
  4. Réponses: 18
    Dernier message: 06/04/2005, 14h09
  5. Arrêter une Thread brutalement!
    Par Rodrigue dans le forum C++Builder
    Réponses: 2
    Dernier message: 18/01/2004, 21h29

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