一个无界一个有界的生产者消费者队列
无界用的数据结构是队列
有界用的是环形缓冲区
什么场景适合什么数据结构在注释中简单的写了一点,更多的可以百度
无界用了一个条件变量,生产者生产后利用条件变量通知队列不为空,消费者利用条件变量通知生产者队列为空应该生产并进行等待
有界用了两个条件变量,因为多了一个条件就是队列满了后应该怎么做
T take() //消费者只要有东西就消费
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() //消费者队列空时等待,取出生产品后通知生产者进行生产
{
MutexLockGuard lock(mutex_);
while (queue_.empty())
{
notEmpty_.wait();
}
assert(!queue_.empty());
T front(queue_.front());
queue_.pop_front();
notFull_.notify();
return front;
}
size_t size() const
{
MutexLockGuard lock(mutex_);
return queue_.size(); //返回当前占用量
}
size_t capacity() const
{
MutexLockGuard lock(mutex_);
return queue_.capacity(); //返回容量
}
boost::circular_buffer<T> queue_;//环形缓冲区,数据频繁读写导致内存频繁释放和分配时,则使用环形缓冲区代替队列