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

  FORUM HardWare.fr
  Programmation
  C++

  queue avec variables conditionnelles (boost)

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

queue avec variables conditionnelles (boost)

n°2176344
in_your_ph​ion
Posté le 18-02-2013 à 19:07:13  profilanswer
 

bonjour,
 
j'aimerais savoir si mon implémentation d'une queue avec deux threads (un consommateur et un producteur) vous parait correcte ?
 
merci par avance !
 
ps : j'ai fait avec boost.
 

Code :
  1. #include <queue>
  2. using namespace std;
  3. #include "boost/signals2/mutex.hpp"
  4. #include "boost/thread/thread.hpp"
  5. #include "boost/thread/condition.hpp"
  6. #include "boost/thread/locks.hpp"
  7. class MyQueue
  8. {
  9. public:
  10.     unsigned pop();
  11.     void push( const unsigned elem );
  12.     bool isEmpty() const;
  13. private:
  14.     std::list<unsigned> _queue;
  15.     mutable boost::signals2::mutex _mtx;
  16.     boost::condition _cond;
  17. };
  18. void MyQueue::push( const unsigned elem )
  19. {
  20.     boost::lock_guard<boost::signals2::mutex> guard( _mtx );
  21.     _queue.push_back( elem );
  22.     _cond.notify_one();
  23.     //unlocked on stack unwiding
  24. }
  25. unsigned MyQueue::pop()
  26. {
  27.     boost::lock_guard<boost::signals2::mutex> guard( _mtx );
  28.     while ( _queue.empty() )
  29.         _cond.wait( _mtx );
  30.     unsigned element = _queue.front();
  31.     _queue.pop_front();
  32.     return element;
  33. }
  34. bool MyQueue::isEmpty() const
  35. {
  36.     boost::lock_guard<boost::signals2::mutex> guard( _mtx );
  37.     return _queue.empty();
  38. }
  39. class Producer : public boost::thread
  40. {
  41. public:
  42.     Producer( MyQueue & q ) : _q( & q )
  43.     {
  44.         boost::thread( boost::BOOST_BIND(&Producer::run, this) );
  45.     }
  46.     void run()
  47.     {
  48.         for ( int i = 0 ;  ; ++i )
  49.         {
  50.             _q->push(i);
  51.             yield();
  52.             //boost::this_thread::sleep( boost::posix_time::milliseconds(1));
  53.         }
  54.         cout << "producer thread stopped." << endl;
  55.     }
  56. private:
  57.     MyQueue * _q;
  58. };
  59. class Consumer : public boost::thread
  60. {
  61. public:
  62.     Consumer( MyQueue & q ) : _q( & q )
  63.     {
  64.         boost::thread( boost::BOOST_BIND(&Consumer::run, this) );
  65.     }
  66.     void run()
  67.     {
  68.         while ( ! interruption_requested() )
  69.         {
  70.             int elem = _q->pop();
  71.         }
  72.     }
  73. private:
  74.     MyQueue * _q;
  75. };
  76. int main(int argc, char *argv[])
  77. {
  78.     MyQueue q;
  79.     Consumer consumer( q );
  80.     Producer producer( q );
  81.     consumer.join();
  82.     producer.join();
  83.     cin.get();
  84.     return 0;
  85. }

mood
Publicité
Posté le 18-02-2013 à 19:07:13  profilanswer
 

n°2176460
theshockwa​ve
I work at a firm named Koslow
Posté le 19-02-2013 à 14:46:57  profilanswer
 

Techniquement, tu peux implémenter une queue thread safe sans mutex (si ta plateforme te garantit des écriture atomiques pour tes pointeurs, c'est assez simple)
 
edit : typo  :o


Message édité par theshockwave le 19-02-2013 à 14:47:19

---------------
last.fm

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

  queue avec variables conditionnelles (boost)

 

Sujets relatifs
questions d'entretien sur Boost ?Comment inscrire des variables dans un fichier PHP ? (fwrite)
[VBS]Récupération de variables dans un fichier INIRécupérer des variables d'un fichier INI
JS fonctions et variables redéfinies(Cplex & C++) Comment résupérer les variables de base ?
Boost dijkstra : recuperer l'intégralité du cheminIncrémenter les noms de variables (var1, var2, var3, ...)
[PHP] Conseil stockage variablesBien sécuriser les variables GET
Plus de sujets relatifs à : queue avec variables conditionnelles (boost)


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