Boost et mutex

Boost et mutex - C++ - Programmation

Marsh Posté le 06-04-2010 à 23:29:37    

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
Reply

Marsh Posté le 06-04-2010 à 23:29:37   

Reply

Marsh Posté le 07-04-2010 à 08:47:29    

ca serait pas plutot le boulot de condition_variable ?

Reply

Marsh Posté le 07-04-2010 à 10:10:08    

Merci, je teste ce soir bientôt.


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

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

Marsh Posté le 09-04-2010 à 23:12:21    

C'est nickel merci.


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

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed