#ifndef PRODUCERCONSUMERBUFFER_H #define PRODUCERCONSUMERBUFFER_H #include #include #include #include using namespace std; template class ProducerConsumerBuffer { private: queue queue_; mutex mutex_; condition_variable get_cv_; bool done_; public: ProducerConsumerBuffer() { done_ = false; } ~ProducerConsumerBuffer() { done(); } void done() { lock_guard lock(mutex_); done_ = true; get_cv_.notify_all(); } T get() { unique_lock lock(mutex_); while (!done_ && queue_.empty()) { cout << "\tgettor waiting" << endl; get_cv_.wait(lock); cout << "\tgettor waking up" << endl; } if ( done_ ) return T(); T result = queue_.front(); queue_.pop(); return result; } void put(const T &item) { unique_lock lock(mutex_); queue_.push(item); lock.unlock(); get_cv_.notify_one(); } }; #endif // PRODUCERCONSUMERBUFFER_H