一、前言
环形队列采用数组模拟,用模运算来模拟环状特性。和基于阻塞队列的生产者消费者模型不同的是,环形队列将公共资源分成多份使用,而阻塞队列则是将公共资源当作一个整体使用!!
二、大致框架
毫无疑问,我们首先需要一个数组来模拟环形队列,并且环形队列的大小也需指明!由于我们是将公共资源(即环形队列)分为多个小块单独使用,生产者向环形队列中插入数据,生产者向环形队列中取数据。这也意味着生产者和消费者的步数不一致,我们需要两个变量分别记录生产者和消费者的运动下标。
对于生产者来说,空间是资源;对于消费者来所,数据是资源。并且生产者不能把消费者套一个圈(此时队列已经为满);消费者不能超越生产者(此时队列已经为空)。由于环形结构起始状态和结束状态都是一样的,不好判断为空或者为,所以我们引入两把计数器分别表示公共资源的个数,即信号量!!(初始时,生产者空间资源为整个数组,消费者数据资源为0)
生产者消费者模型是多生产者多消费者间的消费模型。这也意味者可能存在多个生产者或多个消费者并发访问公共资源,会导致多执行流数据不一致问题!所以我们要为生产者和消费者各自维护一把锁!
【大致框架】:
const int defaultSize = 5; //环形队列大小默认值
template <class T>
class RingQueue
{
public:
RingQueue(int size = defaultSize)
: _size(size), _ringqueue(size), _p_step(0), _c_step(0)
{
sem_init(&_data_sem, 0, 0);
sem_init(&_space_sem, 0, size);
pthread_mutex_init(&_mutex_p, nullptr);
pthread_mutex_init(&_mutex_c, nullptr);
}
~RingQueue()
{
sem_destroy(&_data_sem);
sem_destroy(&_space_sem);
pthread_mutex_destroy(&_mutex_c);
pthread_mutex_destroy