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 �clair�

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

    Informations forums :
    Inscription : Avril 2010
    Messages : 356
    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 Expert
    Avatar de imperio
    Homme Profil pro
    �tudiant
    Inscrit en
    Mai 2010
    Messages
    872
    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 : 872
    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
    Membre Expert
    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
    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 �clair�

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

    Informations forums :
    Inscription : Avril 2010
    Messages : 356
    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
    Membre Expert
    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
    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 �clair�

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

    Informations forums :
    Inscription : Avril 2010
    Messages : 356
    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
    Membre Expert
    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
    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 �clair�

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

    Informations forums :
    Inscription : Avril 2010
    Messages : 356
    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