简介
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 wakeup
while (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_
条件变量