Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
1728 connectés 

  FORUM HardWare.fr
  Programmation
  C++

  Boost et mutex

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

Boost et mutex

n°1981432
ptitchep
Posté le 06-04-2010 à 23:29:37  profilanswer
 

Bonjour,
 
j'ai déjà utilisé les mutex de boost pour protéger l'accès à des données et je ne me souviens pas avoir connu de problème majeur.
J'essaie de les utiliser pour "scheduler" des threads et je suppose que je ne fais pas les choses comme il faut, puisque cela ne fonctionne pas.
 
Le but étant de réveiller un thread de temps en temps. Voici ce que j'ai fait (parmis les nombreux essais). Le code présent dans les threads est remplacé par des sleep car il n'a pas de rapport avec le problème.

Code :
  1. void Scheduler::run()
  2. {
  3.   boost::mutex mutexSynchro;
  4.   boost::mutex::scoped_lock lockSynchro (mutexSynchro); //Blocage du mutex
  5.   Module module(mutexSynchro); //Création du module threadé
  6.  
  7.   while (1)
  8.   {
  9.     sleep (5); //choses à faire
  10.    lockSynchro.unlock(); //Reveil du thread
  11.     std::cerr<<"unlock"<<std::endl;
  12.   }
  13. }
  14. Module::Module(boost::mutex& mutexSynchro):
  15.   mutexSynchro (mutexSynchro),
  16.   leThread (boost::bind(&Module::methodeThread, this))
  17. {
  18. }
  19. void Module::methodeThread()
  20. {
  21.   unsigned i=0;
  22.   boost::mutex::scoped_lock lock(mutexSynchro); //dodo
  23.   while (!fini)
  24.   {
  25.     std::cerr<<i<<std::endl;
  26.     i++;
  27.     sleep(2); //Du code
  28.    
  29.     std::cerr<<"lock"<<std::endl;
  30.     lock.lock();                                //dodo
  31.     std::cerr<<"lock fini"<<std::endl;
  32.   }
  33. }


Résultat:

Citation :

unlock
0
lock
terminate called after throwing an instance of 'boost::lock_error'
  what():  boost::lock_error
Abandon

Donc à la création du scoped_lock, le thread s'endort bien. Puis il est réveillé par le unlock. Par contre l'appelle à lock lève à coup sûr une exception au lieu de s'endormir car le mutex a déjà été bloqué par le même thread. Comment faire alors pour qu'un thread s'endorme à chaque fois sur un mutex et soit reveillé par un autre?


---------------
deluser --remove-home ptitchep
mood
Publicité
Posté le 06-04-2010 à 23:29:37  profilanswer
 

n°1981462
Joel F
Real men use unique_ptr
Posté le 07-04-2010 à 08:47:29  profilanswer
 

ca serait pas plutot le boulot de condition_variable ?

n°1981493
ptitchep
Posté le 07-04-2010 à 10:10:08  profilanswer
 

Merci, je teste ce soir bientôt.


Message édité par ptitchep le 08-04-2010 à 01:24:14

---------------
deluser --remove-home ptitchep
n°1982712
ptitchep
Posté le 09-04-2010 à 23:12:21  profilanswer
 

C'est nickel merci.


---------------
deluser --remove-home ptitchep

Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  C++

  Boost et mutex

 

Sujets relatifs
Boost lambda et objet complexe[boost] Parsing de fichiers simples mais très gros
[boost::serialization] Serialization de classes "inconnues"Boost.preprocessor
BOOST_PP : concatener un caractère spécialboost::intrusive
boost::asio : trouver un port libre ?Compilation avec boost
boost time nanoseconds[Boost::random] Template comme argument d'une fonction...
Plus de sujets relatifs à : Boost et mutex


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR