[Linux] 基于环形队列的生产者消费者模型

遵守的原则

  • 生产者和消费者不能同时指向同一个格子位置
  • 无论是生产者还是消费者,都不能在环形队列中把对方套一个圈以上

模拟基于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);  //释放信号量
		}

	
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值