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

小编 2026-06-27 阅读:826 评论:0
之前的Blog基于Queue的生产者消费者模型,已经谈过了基于queue的生产消费模型,其空间是可以动态分配的。而现在是基于固定大小的环形队列重写这个程序。 基于环形队列的生产消费模型 环形队列采用数组...

之前的Blog基于Queue的生产者消费者模型,已经谈过了基于queue的生产消费模型,其空间是可以动态分配的。而现在是基于固定大小的环形队列重写这个程序。

基于环形队列的生产消费模型

  • 环形队列采用数组模拟,用模运算来模拟环状特性

\"\"

  • 环形结构起始状态和结束状态都是一样的,不好判断为空或者为满,所以就需要通过计数器或者标记位来判断满或空。另外也可以预留一个空的位置,作为满的状态。

 

 

  • 消费者总是跟在生产者的后边,且不会超过生产者
  • 生产者一直在消费者的前边,且不会超过消费者一圈。
  • head和tail指向同一个位置的时候,队列为空。
  • 当head在tail的下一个位置时,环形队列为满。

\"\"

 

/*#####  ringqueue.cc   ####*/
#include\"test.hpp\"

const int num=16;

using namespace std;

void *consume_routine(void *arg)
{	
	int d;
	RingQueue *q=(RingQueue*)arg;
	for(;;)
	{
		q->PopData(d);
		cout<<\"consume done,data is...\"<<d<<endl;
	}
}
void *product_routine(void *arg)
{
	RingQueue *q=(RingQueue*)arg;
	srand((unsigned long)time(NULL));
	for(;;)
	{
		int d=rand()%100+1;
		q->PushData(d);
		cout<<\"Product done,data is...\"<<d<<endl;
		sleep(1);
	} 
}
int main()
{
	RingQueue *q=new RingQueue(num);
	pthread_t c,p;
	pthread_create(&c,NULL,consume_routine,(void*)q);
	pthread_create(&p,NULL,product_routine,(void*)q);


	pthread_join(&c,NULL);
	pthread_join(&p,NULL);


	delete(q);



	return 0;
}
/*******   test.hpp   *******/
#ifndef __TEST_HPP__
#define __TEST_HPP__

#include<vector>
#include<iostream>
#include<pthread.h>
#include<unistd.h>
#include<time.h>
#include<semaphore.h>
#include<stdlib.h>



class RingQueue
{
private:
	std::vector<int> ring;
	int cap;
	sem_t blank_sem;
	sem_t data_sem;

	int c_step;										//consume在圈中的位置
	int p_step;		  								//product在圈中的位置
private:
	void P(sem_t &sem)
	{
		sem_wait(&sem);
	}
	void V(sem_t &sem)
	{
		sem_post(&sem);
	}
public:
	RingQueue(int cap_):cap(cap_),ring(cap_)
	{
		c_step=p_step=0;							//初始时c_step和p_step在同一格
		sem_init(&blank_sem,0,cap);				//初始时需要写入的输入是整个圈的容量
		sem_init(&data_sem,0,0);					//初始时需要consume的值为0
	}
	void PushData(const int& data)					//进行数据生产
	{
		P(blank_sem);
		ring[p_step]=data;							//把数据放进去
		V(data_sem);
		p_step++;
		p_step%=cap;								//进行模运算来模拟环形特性
	}
	void PopData(int &data  )
	{
		P(data_sem);								//申请数据资源
		data=ring[c_step];							//拿到数据
		V(blank_sem);								//空出格子
		c_step++;
		c_step%=cap;
	}
	~RingQueue()
	{
		sem_destroy(&blank_sem);
		sem_destroy(&data_sem);
	}

};

#endif
******   makefile   ******

ringqueue:ringqueue
	.cc
	g++ -o  $@ $^ -lpthread -fpermissive
.PHONY:clean
clean:
	rm -f ringqueue
	

 

版权声明

本文仅代表作者观点,不代表百度立场。
本文系作者授权百度百家发表,未经许可,不得转载。

热门文章
  • 机房智能化温湿度解决方式之POE供电以太网温湿度传感器

    机房智能化温湿度解决方式之POE供电以太网温湿度传感器
    机房智能化温湿度解决方式之POE供电以太网温湿度传感器 北京盈创力和电子科技有限公司 智能型TCP网口温湿度记录仪 北京IP网络温湿度记录仪厂家,北京盈创力和 北京智能型TCP网口温湿度记录仪IP网络温湿度记录仪是一种新型的基于TCP/IP协议双绞线以太网标准温湿度采集模块,利用它可以实现现场温度值、相对湿度值的采集,同时利用其自身的RJ45通信接口可以方便地和机房监控主机或交换机集线器进行联网。 工作于-40℃~85℃工业级带...
  • Sequential Monte Carlo Methods (SMC) 序列蒙特卡洛/粒子滤波/Bootstrap Filtering

    Sequential Monte Carlo Methods (SMC) 序列蒙特卡洛/粒子滤波/Bootstrap Filtering
    Problem Statement 我们考虑一个具有马尔可夫性质、非线性、非高斯的状态空间模型(State Space Model):对于一个时间序列上的观测结果{yt,t∈N}\\{ y_t , t \\in N \\}{yt​,t∈N},我们认为每个观测结果yty_tyt​的生成依赖于一个无法直接观察的隐变量xt∈{xt,t∈N}x_t \\in \\{x_t , t \\in N \\}xt​∈{xt​,t∈N},即:p(...
  • HTTP状态保持的原理

    HTTP状态保持的原理
    a)在用户登录之后,浏览器返回响应的时候会在响应中添加上cookieb)浏览器接收到cookie之后会自动保存c)当用户再次请求同一服务器中的其他网页的时候,浏览器会自动带上之前保存的cookied)服务接收到请求之后可以请 request 对象中取到cookie 判断当前用户是否登录  Http是无状态的,就是连接时数据互通,关闭后...
  • Hive 系统函数及示例

    Hive 系统函数及示例
    查看所有系统函数 show functions; 函数分类 内置函数【系统函数】 数学函数: floor、round、ceil、cos、log2等 字符串函数: length、reverse、trim、lower、get_json_object、repeat等 收集函数: size 转换函数: cast 日期函数: year、month、datediff、date、date_add等 条件函数: coalesce、case…w...
  • CSRF的原理和防范措施

    CSRF的原理和防范措施
    a)攻击原理:i.用户C访问正常网站A时进行登录,浏览器保存A的cookieii.用户C再访问攻击网站B,网站B上有某个隐藏的链接或者图片标签会自动请求网站A的URL地址,例如表单提交,传指定的参数iii.而攻击网站B在访问网站A的时候,浏览器会自动带上网站A的cookieiv.所以网站A在接收到请求之后可判断当前用户是登录状态,所以...
标签列表