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

Boost C++ Discussion :

Boost::Thread, probleme d'execution en parallele


Sujet :

Boost C++

  1. #1
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Janvier 2012
    Messages
    15
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Janvier 2012
    Messages : 15
    Points : 7
    Points
    7
    Par défaut Boost::Thread, probleme d'execution en parallele
    Bonjour a tous,

    J'utilise Boost::thread dans un jeu en reseau que je suis en train de programmer.

    Du cote reseau, je dois au debut de mon programme faire un test de connexion pour une liste de plusieurs ip (listIP).

    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
     
     
    /*
    ** Test if the ip passes in parameter corresponds to an existing spoVnet
    */
    void RaceManager::IsCreated(std::string ip)
    {
      cout << "\n<<<<<<<<<<<<< CREATE NEW THREAD >>>>>>>>>>>>\n" << endl;
     
      boost::mutex::scoped_lock lock(m);
      m_aribanet = new AribaNet("NULL");
     
      if (!m_aribanet->spoVnetIsCreated(ip))
      {
          spoVnetCreated.push_back(ip);
      }
      cout << "\n<<<<<<<<<<<<< EXITED THREAD >>>>>>>>>>>>\n" << endl;
    }
     
    /* 
    ** Function to multithread the test of ip connection
    */
    std::vector<std::string> RaceManager::isConnected()
    {   
       if (fullListIP() == 0)
       {
         boost::thread_group group;
         int i;
         for (i = 0; i < listIP.size(); i++)
         {
    	group.create_thread(boost::bind(&RaceManager::IsCreated, this, listIP.at(i)));
    	//boost::thread t(boost::bind(&RaceManager::IsCreated, this, listIP.at(i)));
         }   
         group.join_all();
       }
     
       // Return a full list of connected IP
       return spoVnetCreated;
    }
    Ces deux fonctions font leur travail correctement et je me retrouve avec une liste d'ip valides.

    Mon vrai probleme, c'est que j'ai utilise les threads car ma fonction isCreated() est tres couteuse en memoire sauf que je ne beneficie pas de l'avantage des threads a savoir, l'execution paralelle.

    J'ai rajoute des sdt::cout au debut et a la fin de ma fonction pour voir un peu le mecanisme de creation sur la console et bizarement, ma fonction me cree bien tous mes thread en meme temps (Tous mes cout sont present) mais les execute un part un en commencant par le premier cree (cout a chaque fin de traitement).

    Du coup, mon execution qui devrait durer 2 seconde pour mes 30 ip me prend 1 minutes
    (2s * 30).

    Je suis au courant que dans le concept, les thread ne font que simuler une execution paralelle sauf que la, j'ai l'impression que je suis sur du pur sequentiel.

    Si quelqu'un comprend mon probleme et sait le corriger, je lui en serais reconnaissant

    Merci d'avance a tous ceux qui essayront de m'aider.

    Bonne soiree

  2. #2
    Membre émérite

    Inscrit en
    Mai 2008
    Messages
    1 014
    Détails du profil
    Informations forums :
    Inscription : Mai 2008
    Messages : 1 014
    Points : 2 252
    Points
    2 252
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    void RaceManager::IsCreated(std::string ip)
    {
      cout << "\n<<<<<<<<<<<<< CREATE NEW THREAD >>>>>>>>>>>>\n" << endl;
     
      boost::mutex::scoped_lock lock(m);
      //...
    }
    mutex = mutual exclusion.
    Toute la fonction IsCreated() après le premier std::cout est protégé par un mutex, du coup il n'y a qu'un seul thread qui peut exécuter le reste de la fonction à la fois. Donc après avoir tous affiché le cout << NEW THREAD Les autres threads bloquent sur le mutex et attendent un par un qu'il se libère. On a effectivement du pur séquentiel.

    Pour retrouver un comportement parallèle il faut enlever le mutex. Maintenant, attention, si quelqu'un à pris la peine de protéger IsCreated par un mutex je suppose que c'est justement parce que IsCreated n'est PAS thread-safe.

  3. #3
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Janvier 2012
    Messages
    15
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Janvier 2012
    Messages : 15
    Points : 7
    Points
    7
    Par défaut
    Merci Arzar,

    Cela a en effet eut pour cause de revenir a une execution parallele, merci beaucoup.

    En fait, je ne connaissais la reelle utilite d'un mutex et je l'avais mis pour enlever une erreur que j'ai surement mal interprete.

    Etant donne que tu as repondu a ma question, je vais passer le sujet en resolu, neanmoins, j'aurais une derniere question.

    En fait, lors de l'execution parallele, mes thread sont bien tous crees en meme temps et s'execute bien en meme temps et du coup, j'ai une erreur que je ne comprend qu'a moitie :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    Cannot register FastQueue. No memory or registered queue more than once.
    Aborted
    Le gdb ne donne aucune autres informations utiles, je pense que je fais tout simplement explose la memoire mais je n'en suis pas sur et je ne trouve rien sur google a propose de cette erreur, tu as une idee ?

    Merci en tout cas,

    Bonne journee

  4. #4
    Membre éclairé
    Avatar de Ekleog
    Homme Profil pro
    Étudiant
    Inscrit en
    Janvier 2012
    Messages
    448
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2012
    Messages : 448
    Points : 879
    Points
    879
    Par défaut
    Quand utilises-tu une FastQueue ?

  5. #5
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Janvier 2012
    Messages
    15
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Janvier 2012
    Messages : 15
    Points : 7
    Points
    7
    Par défaut
    Bonjour,

    Sur ce point, je risque d'être vague car en fait, la FastQueue est utilisée par une librairie réseau appelée SpoVnet.

    Je l'utilise pour crée un mode multijoueur online sur un jeu vidéo et cette erreur apparaît lorsque j'essaye de faire plusieurs connexion vers différents réseau déjà crée en même temps.

    Mon hypothèse est qu'un pc ne peut pas établir plusieurs connexions en même temps mais je n'en suis pas sur,

    tu as une idée ?

    Merci d'avance

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

Discussions similaires

  1. threads callable pas executer en parallele
    Par dumoulex dans le forum Concurrence et multi-thread
    Réponses: 4
    Dernier message: 20/04/2011, 14h35
  2. Arreter l'execution d'un boost::thread
    Par stranger dans le forum Boost
    Réponses: 9
    Dernier message: 22/05/2007, 18h37
  3. Problème d'exécution
    Par Smaugg dans le forum Linux
    Réponses: 22
    Dernier message: 26/04/2004, 09h34
  4. Thread Probleme pour l'arret
    Par Raideman dans le forum C++Builder
    Réponses: 3
    Dernier message: 15/04/2004, 12h17
  5. [Kylix] Probleme d'execution de programmes...
    Par yopziggy dans le forum EDI
    Réponses: 19
    Dernier message: 03/05/2002, 14h50

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