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 :

std::thread et erreur r6010


Sujet :

Threads & Processus C++

  1. #1
    Membre averti
    Homme Profil pro
    graphique/réseau
    Inscrit en
    Janvier 2009
    Messages
    17
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France

    Informations professionnelles :
    Activité : graphique/réseau

    Informations forums :
    Inscription : Janvier 2009
    Messages : 17
    Par défaut std::thread et erreur r6010
    Bonjour à tous,

    j'essaye d'apprendre à utiliser les threads en c++ avec std::thread sous vs2012,
    mais j'ai un petit problème lorsque je test ce bout de code :

    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
     
    #include <thread>
    #include <iostream>
    #include <string>
     
    class Test
    {
    public:
     
    	void Create()
    	{
    		std::thread t(&Test::MyThread, this);
    	}
     
    	void MyThread()
    	{
    		std::cout<<"hi"<<std::endl;
    	}
     
    };
     
    int main()
    {
    	Test t = Test();
    	t.Create();
    }
    y'a pas de problème pour l'utilisation basique de std::thread mais lorsque j'essaye de faire ça dans une classe ça ne passe plus (fenêtre abort avec boutons "ignorer", "recommencer" et "continuer")

    Une idée ?

    merci

  2. #2
    Membre averti
    Homme Profil pro
    graphique/réseau
    Inscrit en
    Janvier 2009
    Messages
    17
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France

    Informations professionnelles :
    Activité : graphique/réseau

    Informations forums :
    Inscription : Janvier 2009
    Messages : 17
    Par défaut
    Bon je crois que j'ai compris mon erreur

    je sais pas si c'est "bon" de faire ça mais quand je passe le std::thread en donnée membre ça marche impec

    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
     
    #include <thread>
    #include <iostream>
    #include <string>
     
    class Test
    {
    public:
    	std::thread m_Thread;
     
    	void creer()
    	{
    		m_Thread = std::thread(&Test::affiche, this);
    	}
     
    	void affiche()
    	{
    		while(true)
    		    std::cout << "hi" << std::endl;
    	}
     
    };
     
    int main()
    {
    	Test t = Test();
    	t.creer();
     
    	while(true)
    		std::cout << "ho" << std::endl;
     
    	return 0;
    }

  3. #3
    Membre Expert

    Inscrit en
    Mai 2008
    Messages
    1 014
    Détails du profil
    Informations forums :
    Inscription : Mai 2008
    Messages : 1 014
    Par défaut
    Bonjour,
    Dans ce cas :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    void Create()
    {
       std::thread t(&Test::MyThread, this);
    }
    le std::thread est crée localement dans la fonction, donc son destructeur est appellée à la sortie de la fonction :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    void Create()
    {
    	std::thread t(&Test::MyThread, this);
    } // <- ici destructeur de t appelé
    Hors si un std::thread atteint son destructeur et que join() n'a pas été appelé auparavant alors aussitôt le destructeur appelle std:terminate et le programme s'arrête sur le champ.
    Donc le code suivant est légal :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    void Create()
    {
       std::thread t(&Test::MyThread, this);
       t.join();
    }
    mais bien sûr join() est bloquant et attend que le thread se termine, donc Create() va bloquer et donc le thread ne sert pas à grand chose au final.

    La bonne solution consiste en effet à faire passer le std::thread comme donnée membre de la classe pour que sa durée de vie ne soit plus liée à celle de la fonction. Par contre il faudra quand même faire attention à ce que join() soit appelé avant que l'objet qui contient le thread soit détruit plus tard.

  4. #4
    Membre averti
    Homme Profil pro
    graphique/réseau
    Inscrit en
    Janvier 2009
    Messages
    17
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France

    Informations professionnelles :
    Activité : graphique/réseau

    Informations forums :
    Inscription : Janvier 2009
    Messages : 17
    Par défaut
    Ok donc j'avais bien cerné le problème.

    Merci d'avoir confirmé

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

Discussions similaires

  1. Erreur avec std::thread (C++11)
    Par gbdivers dans le forum Qt Creator
    Réponses: 0
    Dernier message: 14/08/2012, 11h09
  2. [threads]étrange erreur à la compilation.
    Par méphistopheles dans le forum Boost
    Réponses: 3
    Dernier message: 02/06/2009, 18h22
  3. [Thread] une erreur dans un de nos tuto?
    Par TheBlackReverand dans le forum C#
    Réponses: 5
    Dernier message: 15/06/2008, 19h21
  4. [thread][socket]Erreur connection déconnection
    Par Invité(e) dans le forum C++
    Réponses: 1
    Dernier message: 03/03/2008, 20h33
  5. [threading][logging] erreur de loggage dans un thread
    Par Guigui_ dans le forum Général Python
    Réponses: 5
    Dernier message: 12/10/2005, 15h01

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