BoundedBlockingQueue
该类和上一个相比区别在于,这是有上边界的,当队列为满的时候,不能进行添加操作,当队列为空的时候,不能进行删除操作。
并且该队列是一个循环队列
1 构造函数的实现
//这是一个有参数的构造函数,里面的参数是队列的最大容量
explicit BoundedBlockingQueue(int maxSize)
: mutex_(),
notEmpty_(mutex_),
notFull_(mutex_),
queue_(maxSize)
{
}
2 成员函数的实现
void put(const T& x)函数的实现。
当队列不满的时候,可以进行添加操作,否则阻塞等待。
添加一个元素,不为空的条件变量就通知线程
void put(const T& x)
{
MutexLockGuard lock(mutex_);
//当队列满的时候,不为满的条件变量就在这里阻塞等待
while (queue_.full())
{
notFull_.wait();
}
assert(!queue_.full());
queue_.push_back(x);
notEmpty_.notify();
}
T take()函数的实现。
当队列为空的时候,不为空的条件变量就阻塞等待。
当删除(取走)队列中的元素的时候,不为满的条件变量就通知线程
T take()
{
MutexLockGuard lock(mutex_);
while (queue_.empty())
{
notEmpty_.wait();
}
assert(!queue_.empty());
T front(std::move(queue_.front()));
queue_.pop_front();
notFull_.notify();
return std::move(front);
}
bool empty() const函数的实现
bool empty() const
{
MutexLockGuard lock(mutex_);
return queue_.empty();
}
** bool full() const函数的实现**
bool full() const
{
MutexLockGuard lock(mutex_);
return queue_.full();
}
size_t size() const函数的实现
size_t size() const
{
MutexLockGuard lock(mutex_);
return queue_.size();
}
** size_t capacity() const函数的实现**
size_t capacity() const
{
MutexLockGuard lock(mutex_);
return queue_.capacity();
}