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 :

Interruption de thread


Sujet :

Threads & Processus C++

  1. #1
    Membre actif

    Profil pro
    Inscrit en
    Avril 2010
    Messages
    356
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2010
    Messages : 356
    Points : 206
    Points
    206
    Par défaut Interruption de thread
    Bonjour,

    Je dispose d'une fonction, nommons la f. Cette fonction, je ne l'ai pas écrite, et je ne veux pas avoir à la modifier.
    Le principal souci de cette fonction est son temps d’exécution qui peut varier entre 0 secondes et plusieurs jours en fonction de la "chance" (l'algorithme est probabiliste), et des données en entrée. Je ne sais pas quelles sont les données considérées comme dures (ou plutôt j'ai une vague idée, mais ce n'est pas suffisant).

    Ce que j'aimerais faire, c'est exécuter cette fonction dans un thread séparé et dans le thread principal faire un timer qui termine le thread au bout de 10 minutes par exemple.

    Le problème : Je ne peux avec std::thread interrompre proprement un thread "sans son accord". Or, je ne peux mettre de "breakpoints", dans la fonction f.
    Avez-vous une solution à ce problème (indépendant de l'OS et qui utilise std::thread si possible) ?

    Note : mettre le thread en sleep n'est pas vraiment une solution satisfaisante...

    Merci

  2. #2
    Membre chevronné
    Avatar de imperio
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2010
    Messages
    853
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2010
    Messages : 853
    Points : 2 166
    Points
    2 166
    Par défaut
    Simple question comme ca mais si tu fais ceci :

    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
    #include <thread>
    #include <iostream>
     
    void hello(){
        while (1)
          std::cout << "Hello from thread " << std::endl;
    }
     
    int main(){
        std::thread *t1 = new std::thread(hello);
        usleep(1000);
        std::cout << "Let's try that !" << std::endl;
        delete t1;
        std::cout << "Is it dead ?" << std::endl;
        usleep(1000);
        return 0;
    }
    Est-ce que ca stoppe le thread ?

  3. #3
    Expert confirmé
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2012
    Messages
    1 711
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2012
    Messages : 1 711
    Points : 4 442
    Points
    4 442
    Par défaut
    Citation Envoyé par imperio Voir le message
    Est-ce que ca stoppe le thread ?
    Plus ou moins
    ~thread();
    Thread destructor
    Destroys the thread object.

    If the thread is joinable when destroyed, terminate() is called.
    TOUJOURS join ou detach un thread avant de le supprimer.

    Si le traitement long contient une boucle, tu peux avoir quelques chose du genre
    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
    void foo(time_t maxTime, int& result) {
        time_t start = time(nullptr);
        time_t now = start;
        result = -1;
        while(/* pas trouvé le résultat && */ now - start < maxTime) {
           // chercher le résultat
           now = time(nullptr);
         }
    }
     
    int main() {
        int result;
        std::thread t(std::bind(foo, 600 /* 600 sec == 10 min */, std::ref(result)));
        t.join();
        std::cout << result;
        return 0;
    }

  4. #4
    Membre actif

    Profil pro
    Inscrit en
    Avril 2010
    Messages
    356
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2010
    Messages : 356
    Points : 206
    Points
    206
    Par défaut
    Est-ce que ca stoppe le thread ?
    Je n'ai pas testé, mais il me semble que oui. Cependant, cela ne le stoppe pas proprement.

    Si le traitement long contient une boucle
    Je n'ai pas de contrôle sur la fonction longue.

  5. #5
    Expert confirmé
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2012
    Messages
    1 711
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2012
    Messages : 1 711
    Points : 4 442
    Points
    4 442
    Par défaut
    Avec aucun controle sur la fonction à exécuter c'est pas facile.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    #include <thread>
    #include <chrono>
     
    void foo() { while(1); }
     
    int main() {
    	std::thread(foo).detach();
    	std::this_thread::sleep_for(std::chrono::seconds(5));
    	return 0;
    }
    Tu peux le detach, il sera terminé en même temps que le thread principal, mais tu perd tout contrôle dessus.

  6. #6
    Membre actif

    Profil pro
    Inscrit en
    Avril 2010
    Messages
    356
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2010
    Messages : 356
    Points : 206
    Points
    206
    Par défaut
    Tu peux le detach, il sera terminé en même temps que le thread principal, mais tu perd tout contrôle dessus.
    Le souci, c'est que l'idée est de relancer l'algorithme : l'algorithme étant probabiliste, il se peut qu'on ait plus de chance.
    L'algorithme prend beaucoup de mémoire (300-400 Mo), on ne peut donc le mettre en sleep/le terminer de manière non propre.

  7. #7
    Expert confirmé
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2012
    Messages
    1 711
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2012
    Messages : 1 711
    Points : 4 442
    Points
    4 442
    Par défaut
    Y a t'il une réelle différence entre le relancer, et le laisser s'exécuter ? Il y a plus de chance de trouver une solution en le lançant 2 fois 10 minutes plutôt qu'une fois 20 minutes ?

    Peut être que la solution est de lancer le calcul dans un autre process ?

  8. #8
    Membre actif

    Profil pro
    Inscrit en
    Avril 2010
    Messages
    356
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2010
    Messages : 356
    Points : 206
    Points
    206
    Par défaut
    Y a t'il une réelle différence entre le relancer, et le laisser s'exécuter ? Il y a plus de chance de trouver une solution en le lançant 2 fois 10 minutes plutôt qu'une fois 20 minutes ?
    Je pense, ça fait partie des choses que je veux vérifier.

    Peut être que la solution est de lancer le calcul dans un autre process ?
    C'est la solution qui parait le plus facile. Cependant, je trouve cela étrange et quelque peu gênant (les threads sont beaucoup plus légers..., plus facile à manipuler, pas de pipe pour transférer les données, std::process n'existe pas encore...).

    Je souhaitais vérifier qu'il n'y avait pas de solution avec des threads. Si tel est le cas, comme vous semblez le dire, je me tournerai vers les processus.

Discussions similaires

  1. Interruption de thread
    Par adn013 dans le forum Concurrence et multi-thread
    Réponses: 2
    Dernier message: 21/08/2007, 09h47
  2. Interruption et reprise d'un Thread
    Par Nuro dans le forum Concurrence et multi-thread
    Réponses: 1
    Dernier message: 28/02/2007, 21h34
  3. Interruption d'un Thread
    Par doudblast dans le forum Concurrence et multi-thread
    Réponses: 3
    Dernier message: 11/03/2006, 17h30
  4. interrupt() de la classe thread
    Par canigu dans le forum Concurrence et multi-thread
    Réponses: 2
    Dernier message: 25/12/2005, 14h01
  5. Interruption de thread
    Par bigben89 dans le forum Windows
    Réponses: 2
    Dernier message: 13/10/2005, 10h41

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