基于RingQueue的生产者消费者模型
遵守的原则
- 生产者和消费者不能同时指向同一个格子位置
- 无论是生产者还是消费者,都不能在环形队列中把对方套一个圈以上
模拟基于RingQueue的生产者消费者模型
1)实现逻辑(利用POSIX信号量)
初始时,环形队列中全是空格:生产者要在空位置处生产数据;
生产者生产数据:申请格子信号量----生产数据----释放数据信号量
消费者消费数据:申请数据信号量----消费数据----释放格子信号量
2)代码实现
1. 实现BlockingQueue阻塞队列的基本功能
void Put(int &in)----生产者生产数据,P操作->往环形队列中放置数据->V操作
void Get(int &out)----消费者消费数据,P操作->从环形队列里面取数据->V操作
class RingQueue
{
private:
vector<int> vec; //利用数组来实现环形队列,这里使用c++中的vector迭代器
int max_cap; //环形队列的最大容量
//利用信号量,其本身就是一个计数器
sem_t sem_blank; //格子:生产者
sem_t sem_data; //数据:消费者
int p_index; //标记生产者位置的下标
int c_index; //标记消费者位置的下标
void P(sem_t &s){
//POSIX信号量中,P操作用sem_wait()---count--;
sem_wait(&s); //申请信号量
}
void V(sem_t &s){
//POSIX信号量中,V操作用sem_post()---count++;
sem_post(&s); //释放信号量
}