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 :
- void Scheduler::run()
- {
- boost::mutex mutexSynchro;
- boost::mutex::scoped_lock lockSynchro (mutexSynchro); //Blocage du mutex
- Module module(mutexSynchro); //Création du module threadé
-
- while (1)
- {
- sleep (5); //choses à faire
- lockSynchro.unlock(); //Reveil du thread
- std::cerr<<"unlock"<<std::endl;
- }
- }
- Module::Module(boost::mutex& mutexSynchro):
- mutexSynchro (mutexSynchro),
- leThread (boost::bind(&Module::methodeThread, this))
- {
- }
- void Module::methodeThread()
- {
- unsigned i=0;
- boost::mutex::scoped_lock lock(mutexSynchro); //dodo
- while (!fini)
- {
- std::cerr<<i<<std::endl;
- i++;
- sleep(2); //Du code
-
- std::cerr<<"lock"<<std::endl;
- lock.lock(); //dodo
- std::cerr<<"lock fini"<<std::endl;
- }
- }
|
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