简介
moduo中的队列与java线程池中的队列类似, 有无界阻塞队列和有界阻塞队列
结构
BlockingQueue
无界阻塞队列
构造函数
初始化互斥量,条件变量,以及队列
BlockingQueue(): mutex_(),notEmpty_(mutex_),queue_(){}
添加元素
添加元素方法有两下, 一个传常左值引用 ,一个右值引用
添加后,会唤醒等待线程
void put(const T& x)
{MutexLockGuard lock(mutex_);queue_.push_back(x);notEmpty_.notify(); // wait morphing saves us
}void put(T&& x)
{MutexLockGuard lock(mutex_);queue_.push_back(std::move(x));notEmpty_.notify();
}
取元素
当队列为空时,会条件等待直到队列不为空
T take()
{MutexLockGuard lock(mutex_);// always use a while-loop, due to spurious wakeupwhile (queue_.empty()){notEmpty_.wait();}assert(!queue_.empty());T front(std::move(queue_.front()));queue_.pop_front();return front;
}
清空队列
将队列移动到临时队列中并返回
queue_type drain()
{std::deque<T> queue;{MutexLockGuard lock(mutex_);queue = std::move(queue_);assert(queue_.empty());}return queue;
}
BoundedBlockingQueue
有界阻塞队列差别是添加了notFull_
条件变量,同时队列使用boost的环形队列
添加元素时,会先等待队列不为满
取元素时,会唤醒notFull_
条件变量