queue avec variables conditionnelles (boost)

queue avec variables conditionnelles (boost) - C++ - Programmation

Marsh Posté le 18-02-2013 à 19:07:13    

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. }

Reply

Marsh Posté le 18-02-2013 à 19:07:13   

Reply

Marsh Posté le 19-02-2013 à 14:46:57    

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
Reply

Sujets relatifs:

Leave a Replay

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