#ifndef __THREADSAFE_QUEUE_H__ #define __THREADSAFE_QUEUE_H__ #include #include #include #include #include using std::queue; using namespace std; template class ThreadedQueue : public queue { public: ThreadedQueue(); ~ThreadedQueue(); bool empty() const; size_t size() const; void push(const T& val); void push(T& val); bool pop(); T& front(); const T& front() const; T& back(); const T& back() const; void Put(T &data); T Take(); void Get(T &data); bool GetEmpty(); condition_variable *condition; mutex *lock; }; template ThreadedQueue::ThreadedQueue() { lock = new mutex; condition = new condition_variable; } template ThreadedQueue::~ThreadedQueue() { if(condition != nullptr){ delete condition; condition = nullptr; } if(lock != nullptr){ delete lock; lock = nullptr; } } template T ThreadedQueue:: Take() { std::unique_lock lk(this->lock); this->condition->wait(lk, [this]{return !this->empty();}); T val = this->front(); this->pop(); return val; } template void ThreadedQueue:: Put(T &data) { std::unique_lock lk(*lock); this->push(data); this->condition->notify_one(); return; } template void ThreadedQueue:: Get(T &data) { std::unique_lock lk(*lock); this->condition->wait(lk, [this]{return !this->empty();}); data = this->front(); this->pop(); } template bool ThreadedQueue::GetEmpty() { std::unique_lock lk(*lock); this->condition->wait(lk, [this]{return !this->empty();}); return true; } template bool ThreadedQueue::empty() const { bool result = queue::empty(); return result; } template size_t ThreadedQueue::size() const { size_t result = queue::size(); return result; } template void ThreadedQueue::push(T& val) { queue::push(val); } template T& ThreadedQueue::front() { T& result = queue::front(); return result; } template bool ThreadedQueue::pop() { bool result = false; if(!queue::empty()) { queue::pop(); result = true; } return result; } #endif