// -*- C++ -*- #ifndef IPZONE_COMMON_LOCKED_QUEUE_H #define IPZONE_COMMON_LOCKED_QUEUE_H #include #include #include /// template class locked_queue { public: /// typedef boost::mutex::scoped_lock lock; /// typedef typename std::queue::value_type value_type; /// typedef typename std::queue::reference reference; /// typedef typename std::queue::const_reference const_reference; /// locked_queue(unsigned int n = 10) : max_size_(n) {} /// void send(value_type const & v) { lock lk(monitor_); while (queue_.size() == max_size_) queue_not_full.wait(lk); queue_.push(v); queue_not_empty.notify_one(); } /// value_type receive() { lock lk(monitor_); while (queue_.size() == 0) queue_not_empty.wait(lk); value_type vt = queue_.front(); queue_.pop(); queue_not_full.notify_one(); return vt; } /// bool empty() const { lock lk(monitor_); return queue_.empty(); } private: /// unsigned int max_size_; /// mutable boost::mutex monitor_; /// boost::condition queue_not_full; /// boost::condition queue_not_empty; /// std::queue queue_; }; #endif