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 :

Stopper la fonction exécutée par un thread avec un attribut


Sujet :

Threads & Processus C++

  1. #1
    Membre averti Avatar de Razgriz
    Profil pro
    Professeur / chercheur en informatique / mathématiques
    Inscrit en
    Avril 2006
    Messages
    391
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations professionnelles :
    Activité : Professeur / chercheur en informatique / mathématiques

    Informations forums :
    Inscription : Avril 2006
    Messages : 391
    Points : 306
    Points
    306
    Par défaut Stopper la fonction exécutée par un thread avec un attribut
    Bonjour à tous,

    je viens de débuter la gestion de threads en C++, et je tente d'en stopper un. Je sais que la librairie ne permet pas de le faire et pourquoi. J'ai donc recours au code suivant minimal.

    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
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
     
    #include <iostream>
    #include <chrono>
    #include <thread>
     
    using namespace std;
     
    std::chrono::seconds sec(1);
     
    class Runnable
    {
        public:
            bool stop;
            Runnable(bool b = false) : stop(b) {}
     
            void operator()()
            {
                while(! stop)
                {
                    cout << "Hello you" << endl;
                    this_thread::sleep_for(sec);
                }
     
                cout << "Thread stopped" << endl;
            }
    };
     
    int main()
    {
        Runnable r;
        thread t(r);
     
        bool stop = false;
        while(! stop)
        {
            cout << "Press anything to stop" << endl;
            char c;
            cin >> c;
            r.stop = true;
            this_thread::sleep_for(sec);
            stop = true;
        }
    }
    Néanmoins, quand je presse une touche, le threads qui affiche "Hello you" ne s'arrête pas, je ne vois pas "Thread stopped".

    Qu'est-ce que je fais de mal ?
    On a toujours besoin d'un plus bourrin que soi

    Oui il y a quelques bugs dans ma librairie de Sécurité, mais les classes postées ne sont pas celles de la dernière version, et j'ai la flemme de tout modifier. Je vous donnerai avec plaisir la dernière version du jar par mp.

  2. #2
    Expert éminent sénior
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2005
    Messages
    5 074
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Conseil

    Informations forums :
    Inscription : Février 2005
    Messages : 5 074
    Points : 12 120
    Points
    12 120
    Par défaut
    Pour attendre la fin d'un thread c'est la méthode join :
    http://www.cplusplus.com/reference/thread/thread/

    Et le mot clé volatile est ton ami :
    http://stackoverflow.com/questions/1...ad-shared-data

  3. #3
    Membre averti Avatar de Razgriz
    Profil pro
    Professeur / chercheur en informatique / mathématiques
    Inscrit en
    Avril 2006
    Messages
    391
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations professionnelles :
    Activité : Professeur / chercheur en informatique / mathématiques

    Informations forums :
    Inscription : Avril 2006
    Messages : 391
    Points : 306
    Points
    306
    Par défaut
    Citation Envoyé par bacelar Voir le message
    Pour attendre la fin d'un thread c'est la méthode join :
    http://www.cplusplus.com/reference/thread/thread/
    Je connais la méthode join et comment elle fonctionne. Toutefois, ajouter t.join() à la ligne 40 ne résoudra pas le problème (j'ai testé) vu que t ne s'arrête tout simplement pas, impressions à l'appui.

    Citation Envoyé par bacelar Voir le message
    Et le mot clé volatile est ton ami :
    http://stackoverflow.com/questions/1...ad-shared-data
    Ajouter volatile à la variable stop (ligne 13) ne résout pas le problème. Notez que si je crée une fonction stop qui change la valeur de ce booléen, imprimer dans cette fonction la valeur du booléen après changement se passe correctement : le booléen a bien changé de valeur. Toutefois, au sein de operator(), ce changement n’apparaît pas (si on fait une impression à cet endroit là).

    Merci d'avance pour vos réponses.
    On a toujours besoin d'un plus bourrin que soi

    Oui il y a quelques bugs dans ma librairie de Sécurité, mais les classes postées ne sont pas celles de la dernière version, et j'ai la flemme de tout modifier. Je vous donnerai avec plaisir la dernière version du jar par mp.

  4. #4
    Membre éprouvé Avatar de fenkys
    Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Octobre 2007
    Messages
    376
    Détails du profil
    Informations personnelles :
    Âge : 56
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Octobre 2007
    Messages : 376
    Points : 1 054
    Points
    1 054
    Par défaut
    Si tu rajoutes un cout dans le constructeur de Runable, tu comprendras instantanément ce qui se passe.

    En bref, l'objet qui s’exécute dans le thread n'est pas celui que tu as créé, mais une copie de cet objet.

  5. #5
    Membre averti Avatar de Razgriz
    Profil pro
    Professeur / chercheur en informatique / mathématiques
    Inscrit en
    Avril 2006
    Messages
    391
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations professionnelles :
    Activité : Professeur / chercheur en informatique / mathématiques

    Informations forums :
    Inscription : Avril 2006
    Messages : 391
    Points : 306
    Points
    306
    Par défaut t
    Ok... suis con ;-)

    Voici comment résoudre le problème, pour les futurs cas similaires.

    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
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
     
    #include <iostream>
    #include <chrono>
    #include <thread>
     
    using namespace std;
     
    std::chrono::seconds sec(1);
     
    class Runnable
    {
        public:
            bool stop;
            Runnable(bool b = false) : stop(b) {}
     
            void operator()()
            {
                while(! stop)
                {
                    cout << "Hello you" << endl;
                    this_thread::sleep_for(sec);
                }
     
                cout << "Thread stopped" << endl;
            }
    };
     
    int main()
    {
        Runnable r;
        thread t(ref(r));
     
        bool stop = false;
        while(! stop)
        {
            cout << "Press anything to stop" << endl;
            char c;
            cin >> c;
            r.stop = true;
            this_thread::sleep_for(sec);
            stop = true;
        }
    }
    On a toujours besoin d'un plus bourrin que soi

    Oui il y a quelques bugs dans ma librairie de Sécurité, mais les classes postées ne sont pas celles de la dernière version, et j'ai la flemme de tout modifier. Je vous donnerai avec plaisir la dernière version du jar par mp.

  6. #6
    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 bacelar Voir le message
    Et le mot clé volatile est ton ami :
    http://stackoverflow.com/questions/1...ad-shared-data
    C'est un cadeau empoisonné. volatile n'a pas beaucoup d'amis.

    Un std::atomic<bool> est généralement une meilleure approche. Même si j'imagine qu'un bool est de toute façon atomique donc les deux solutions reviendraient plus ou moins au même.

  7. #7
    Rédacteur/Modérateur


    Homme Profil pro
    Network game programmer
    Inscrit en
    Juin 2010
    Messages
    7 115
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : Canada

    Informations professionnelles :
    Activité : Network game programmer

    Informations forums :
    Inscription : Juin 2010
    Messages : 7 115
    Points : 32 967
    Points
    32 967
    Billets dans le blog
    4
    Par défaut
    C'est résolu mais dans le code initiale je ne vois aucun thread lancé.
    Pensez à consulter la FAQ ou les cours et tutoriels de la section C++.
    Un peu de programmation réseau ?
    Aucune aide via MP ne sera dispensée. Merci d'utiliser les forums prévus à cet effet.

  8. #8
    Membre éprouvé Avatar de fenkys
    Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Octobre 2007
    Messages
    376
    Détails du profil
    Informations personnelles :
    Âge : 56
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Octobre 2007
    Messages : 376
    Points : 1 054
    Points
    1 054
    Par défaut
    Mais si:


    Ca correspond à ce prototype :

    Code c++ : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    template< class Function, class... Args >
    explicit thread( Function&& f, Args&&... args );

    qui "Creates new std::thread object and associates it with a thread of execution.". Le thread est donc bien lancé.

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

Discussions similaires

  1. Changer la méthode exécuter par un thread
    Par sfaxien dans le forum C#
    Réponses: 3
    Dernier message: 17/12/2009, 16h17
  2. Réponses: 9
    Dernier message: 24/08/2007, 12h37
  3. [Thread] Stopper l'exécution d'un thread brutalement
    Par Razgriz dans le forum Concurrence et multi-thread
    Réponses: 7
    Dernier message: 31/01/2007, 19h55
  4. Réponses: 5
    Dernier message: 16/12/2005, 17h41
  5. Thread avec une fonction membre d'une classe
    Par SteelBox dans le forum Windows
    Réponses: 6
    Dernier message: 01/03/2004, 01h15

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