#ifndef BLOCKING_QUEUE_H
#define BLOCKING_QUEUE_H
template <typename T,
typename Queue,
typename Lockable,
typename ConditionVariable,
typename LockGuard>
class blocking_queue
{
public:
blocking_queue(Queue& queue,
Lockable& mutex,
ConditionVariable& conditionVariable)
: queue(queue),
mutex(mutex),
conditionVariable(conditionVariable)
{}
void push_and_notify_one(T task)
{
{
LockGuard lock(mutex);
queue.push(task);
}
conditionVariable.notify_one();
}
T wait_and_pop()
{
LockGuard lock(mutex);
while (queue.empty())
{
conditionVariable.wait(lock);
}
T task = queue.front();
queue.pop();
return task;
}
void push_and_notify_all(T task)
{
{
LockGuard lock(mutex);
queue.push(task);
}
conditionVariable.notify_all();
}
private:
Queue& queue;
Lockable& mutex;
ConditionVariable& conditionVariable;
};
#endif // BLOCKING_QUEUE_H