进程模拟生产者-消费者问题

经典进程同步与互斥问题(5) 生产者-消费者问题是指有两组进程共享一个环形的缓冲池。一组进程被称为生产者,另一组进程被称为消费者.一个数据对象若被多个并发进程所共享,且其中一些进程只要求读该数据对象的内容,而另一些进程则要求写操作,对此,我们把只想读的进程称为“读者”,而把要求写的进程称为“写者”。哲学家进餐问题。打磕睡的理发师问题 阅读详情

这里我只是简单实现了这个经典问题的思路与想打,并且书写的程序也是能正确的运行出合理的答案,希望今后还可以改进程序使之更加完善

思路描述:

1.生产者进程:产生一个数据,当要送入缓冲区的时候,要检查缓冲区是否已满,若未满,则可将数据送入缓冲区,并通知消费者进程,否则等待

2.对于消费者进程:当它去取数据的时候,要看缓冲区中是否有数据可以去取,若有则取走一个数据,并通知生产者进程,否则等待

3.缓冲区是一个临界资源,因此,诸进程对缓冲区的操作程序是一个共享临界区,所以这里还有一个互斥问题

public class question_test {

	public static void main(String[] args) {
		
		//主方法
		Mutex mtex = new Mutex();
		mtex.setFull(0); //设置缓存区最大存放10个产品
		mtex.setMutex(false); //缓存区默认状态为未使用
		
		//创建消费者进程
		Customer c1 = new Customer(mtex);
		Customer c2 = new Customer(mtex);
		Customer c3 = new Customer(mtex);
		Customer c4 = new Customer(mtex);
		Customer c5 = new Customer(mtex);
		Customer c6 = new Customer(mtex);
		Customer c7 = new Customer(mtex);
		
		//创建生产者进程
		Producer p1 = new Producer(mtex);
		Producer p2 = new Producer(mtex);
		Producer p3 = new Producer(mtex);
		Producer p4 = new Producer(mtex);
		Producer p5 = new Producer(mtex);
		Producer p6 = new Producer(mtex);
		Producer p7 = new Producer(mtex);
		
		//启动消费者,生产者进程
		p1.start();
		p2.start();
		p3.start();
		p4.start();
		p5.start();
		p6.start();
		p7.start();
		c1.start();
		c2.start();
		c3.start();
		c4.start();
		c5.start();
		c6.start();
		c7.start();
	}

}

class Mutex {
	//判断互斥变量,是否可以使用临界资源(缓冲区)
	private boolean mutex;
	private int full;

	public int getFull() {
		return full;
	}

	public void setFull(int full) {
		this.full = full;
	}

	public boolean isMutex() {
		return mutex;
	}

	public void setMutex(boolean mutex) {
		this.mutex = mutex;
	}
}

class Customer extends Thread{
	Customer(Mutex mtx){
		this.mtx = mtx;
	}
	public Mutex mtx;
	
	//申请缓冲区
	public void p_cus(){
			//判断缓冲区中是否有资源可以去取
			if(mtx.getFull()>0){
				//判断缓冲区是否被使用
				if(mtx.isMutex()){
					//这里没有写等待,若是加入等待可用sleep()方法
					//我在这里直接是打印出相关消息
					System.out.println("生产者正在向缓冲区中放产品,消费者无法使用缓冲区!!!");
				}else{
					mtx.setMutex(true);
					mtx.setFull(mtx.getFull()-1);
					System.out.println("消费者消费1件产品,当前库存:"+mtx.getFull());
				}
			}else{
				System.out.println("缓存区无产品!!!");
			}
		}	
	
	//释放缓冲区使用权
	public void v_cusmex(){
		mtx.setMutex(false);
	}
	
	//重写run方法,调用申请与释放缓冲区函数
	public void run(){
			p_cus();
			v_cusmex();
	}
	
}

class Producer extends Thread{
	Producer(Mutex mtx){
		this.mtx = mtx;
	}
	//访问缓存区互斥判断当为true表示正在访问缓存区。
	public Mutex mtx;
	
	//生产一个产品;
	public void p_pro(){
			//这里默认缓冲区最多存放30个资源,同消费者一样进行相应的判断
			if(mtx.getFull()<30&&mtx.getFull()>=0){
				if(mtx.isMutex()){
					//只是简单地输出相关状态信息,如果想让进城等待加入sleep函数
					System.out.println("消费者正在从缓冲区中取产品,生产者无法使用缓冲区!!!");
				}else{
					mtx.setMutex(true);
					mtx.setFull(mtx.getFull()+1);
					System.out.println("产品已经生产放入缓冲区,当前库存:"+mtx.getFull());
				}
			}else{
				System.out.println("仓库已满!暂时不能生产!");
			}
	}
	
	public void v_promex(){
		mtx.setMutex(false);
	}
	
	//重写run方法,调用申请与释放缓冲区函数
	public void run(){
			p_pro();
			v_promex();
	}	
}






这就是模拟出来的效果,希望可以帮助到你理解这个经典的进程调度问题!



Linux进程互斥——生产者-消费者 经典的进程同步问题——生产者-消费者模拟生产者-消费者的示例程序示例程序代码运行结果改造该程序,取消所有的同步机制,记录执行情况并进行分析代码如下运行结果 模拟生产者-消费者的示例程序 本示例主要体现进程间的直接制约关系,由于使用共享存储区,也存在间接制约关系。进程分为服务进程和客户进程,服务进程只有一个,作为消费者,在每次客户进程改变共享存储区内容时显示其数值。各客户进程作为生产者,如果共享存储区内容已经显示(被消费),可以接收用户从键盘输入的整数,放在共享存储区。 编译后执行,第一个进程实例将作为服务进 阅读详情

相关推荐

用C#线程技术模拟“生产者-消费者”经典进程同步问题

今天看了C#的线程相关的内容,也做了一些练习,顺便实现了操作系统中比较经典的进程同步问题——生产者-消费者。这个问题实在比较经典,当然也是比较简单的,呵呵。 大体思路如下: 缓冲区——假设有一个大小为2的缓冲区,在我的例子里,缓冲区是一个队列Queue。生产者——在我的例子里,生产者是一个名为download()的函数。消费者——在我的例子里,消费者是一个名为print

独自旅行的BLOG 1738

生产者消费者模型

生产者消费者模型:                 两个进程共享一个缓冲区,一个进程称为生产者,它向缓冲区里放数据,另一个进程称为消费者,他向缓冲区里取数据,当生产者向缓冲区里放数据是就必须进入挂起状态, 知道消费者从缓冲区中取走数据后生产者才能继续向缓冲区里放数据,同样当缓冲区中没有数据时,消费者进程就必须进入挂起休眠状态,直到生产者向缓冲区中放入数据时,消 费者才能唤醒继续从缓冲区中取数

qq_36534818的博客 507

东北大学操作系统实验:进程同步和通信(生产者消费者问题模拟)

//producer_consumer.cc #include #include #include using namespace std; const int bufferSize = 8; vector buffer(bufferSize); queue waitQueue; int id; int writeptr, readptr; int consumer, producer; v

深空的博客 3377

操作系统笔记——生产者-消费者问题

一、问题描述 1.有两个进程,生产者进程和消费者进程 2.临界资源:缓冲池 3.关系:只要缓冲池不满,生产者进程就可以向缓冲池中存入信息;只要缓冲池不空,消费者就可以从缓冲池中拿走信息。缓冲池同时只能被一共进程占用。 二、互斥问题 1.缓冲池中的缓冲区有N个。 2.信号量设置: (1)互斥信号量mutex,这个信号量用于标注缓冲池是否被占用 互斥信号量的设置,要看有哪几种互斥就设置几个。比如若是允许生产者写的时候,消费者读,互斥的关系就是:生产者和生产者互斥写入缓存区;消费者和消费者互斥读缓

ZZC14790409310的博客 2306

操作系统---“进程调度模拟程序” , “生产者―消费者问题算法的实现” , “银行家算法的实现”

如果有正在学习计算机操作系统的小伙伴,可以通过此文章对进程调度模拟程序,生产者――消费者问题算法的实现,银行家算法的实现更加清楚。 本人也只是一个学生,下面内容我主要整合了一些学习心得和成果,还有能够帮助自己快速掌握知识的视频,网站,链接。希望对你们有用。 1.进程调度模拟程序 #include <algorithm> #include <iostream> #include <vector> using namespace std;...

m0_61988713的博客 1416

C语言实现生产者和消费者问题(附完整源码)

C语言实现生产者和消费者问题(附完整源码)

希望我的博客,能帮上你解决学习中工作中所遇到的问题 1540

实验四 用信号量解决进程互斥与同步问题 生产者与消费者问题模拟

实验四 用信号量解决进程互斥与同步问题生产者与消费者问题模拟姓名 黄淋生 专业 网络工程 学号 201306114112 一、实验目的1. 掌握临界区的概念及临界区的设计原则;2. 掌握信号量的概念、PV操作的含义以及应用PV操作实现进程的同步与互斥;3. 分析进程争用资源的现象,学习解决进程互斥的方法。二、实验内容分析进程的同步与互斥现象,编程实现经典的进程同步问题——生产者消费者问题...

weixin_33835103的博客 3139

模拟生产者/消费者问题:Linux C环境中的多进程与多线程实现

生产者/消费者问题是一个经典的并发编程问题,它揭示了线程或进程之间同步和通信的需求。在多任务环境中,生产者线程负责生成数据并将其放入缓冲区,而消费者线程从缓冲区取出并处理这些数据。为了避免数据不一致和资源浪费,这两个操作必须通过某种形式的同步机制来协调。同步是指在多任务环境中,为了防止并发执行的进程或线程因共享资源或执行顺序问题导致的不一致性,而采取的一种协调机制。在生产者/消费者模型中,同步确保生产者不会在消费者处理数据之前就覆盖了缓冲区的内容,反之亦然。

weixin_29997223的博客 958

模拟进程之间的互斥与同步关系之生产者-消费者问题

生产者-消费者问题 程序流程图 源代码 生产者-消费者问题 生产者-消费者问题描述的是:有一群生产者进程在生产产品,并将这些产品提供给消费者进程去消费。为使生产者进程与消费者进程能够并发执行,在两者之间设置了一个具有n个缓冲区的缓冲池,生产者进程将它所生产的产品放入一个缓冲区中;消费者进程可以从一个缓冲区中取走产品去消费。尽管所有的生产者和消费者进程都是以异步方式运行的,但它们之间必须保持同步,即...

xiaoning9299的博客 1397

生产者-消费者问题的模拟实现(课设含源代码).doc

用进程同步方法解决“生产者-消费者”问题,C或C++语言实现。 1、设计目的 通过研究进程并发和信号量机制,实现生产者-消费者问题的并发控制。 2、设计要求 1)每个生产者和消费者对有界缓冲区进行操作后,即时显示有界缓冲区的全部内容,当前指针位置和生产者/消费者进程的标识符。 说明:有界缓冲区(提示:有界缓冲区可用数组实现)内设有20个存储单元,放入/取出的数据项设定为1-20这20个整型数。 2)生产者和消费者各有两个以上。 3)多个生产者或多个消费者之间须有共享对缓冲区进行操作的函数代码。

六轴机器人正解

采用的是John H.Craig在【机器人学导论】中的改进DH模型 1.六轴坐标系 2.DH参数 i αi−1\alpha_{i-1}αi−1​ ai−1a_{i-1}ai−1​ did_idi​ θi\theta_iθi​初值 1 0 0 0 0 2 -90 a1a_1a1​ 0 -90 3 0 a2a_2a2​ 0 -90 4 -90 a3a_3a3​ d4d...

m0_37581770的博客 2511

进程同步和通信 -生产者和消费者问题模拟

程序说明:这是我自己修改后的操作系统实验题目(这里有许多创新之处,至少对我而言)。 缓冲区可以容纳8个数据;因为缓冲区是有限的,因此当其满了时生产者进程应该等待;当消费者取走一个数据后,应唤醒正在等待的生产者进程; 当缓冲区空时,消费者进程应该等待;当生产者向缓冲区放入了一个数据时,应唤醒正在等待的消费者进程。这就是生产者和消费者之间的同步。 每次写入和读出数据时,都将读和写指...

ChrisChao1992的博客 690

dmx512协议c语言编程,DMX512协议+c程序代码.pdf

DMX512 协议1.协议简介DMX 是Digital MultipleX 的缩写 ,意为多路数字传输。DMX512 控制协议是美国舞台灯光协会(USITT)于1990 年发布的灯光控制器与灯具设备进行数据传输的工业标准 ,全称是 USITT DMX512(1990) ,包括电气特性、数据协议、数据格式等方面的内容。2. 电气特性和物理层2.1. 电气特...

weixin_39928993的博客 2543

JAVA 操作系统:进程同步机制模拟-生产者消费者问题

用java信号量机制实现生产者消费者进程同步问题

m0_69064777的博客 1392

Go语言集成Ollama本地大模型:gollama库实战指南

在当今的AI应用开发中,大型语言模型(LLM)的集成已成为关键技术。其核心原理是通过API调用,将自然语言处理能力嵌入到各类应用中。从技术价值看,本地化部署的LLM解决了数据隐私、网络延迟和持续成本三大痛点,尤其适合处理敏感数据或对实时性要求高的场景。在工程实践中,开发者常使用专门的客户端库来简化与模型服务的交互,例如通过封装REST API、提供类型安全接口和流式处理支持,从而提升开发效率和代码健壮性。具体到Go语言生态,结合Ollama这一流行的本地大模型运行工具,可以实现完全离线、低延迟的AI功能集成

weixin_28728443的博客 604

一份针对零基础学习AI Agent详细学习计划

以下是针对零基础学习者制定的AI Agent详细学习计划,结合最新行业动态和实用资源推荐,帮助你从入门到进阶系统掌握核心技能

sexy19910923的博客 1903

利用信号量机制实现生产者消费者问题(用进程通信进行模拟)

生产者消费者同步问题:生产者进程产生消息放在某个共享资源区,共享资源区的消息不为空时消费者进程从该共享资源区读取消息,为了避免脏读生产者和消费者不能同时访问共享资源,这就涉及到生产者和消费者进程之间的同步。利用信号量解决该问题: 定义两个信号量(不能是一个,否则生产者或者消费者可能会无限的访问共享资源,形成死循环)S1、S2,初始值为1,0。S1=1表示生产者进程可写共享资源,为0则不可;S2=1...

qq_41648012的博客 6222

EDA的未来:当AI与Cadence Virtuoso相遇

本文探讨了AI技术与Cadence Virtuoso在EDA领域的融合,展示了如何通过生成式AI提升芯片设计效率。文章详细分析了Virtuoso设计环境的智能化演进、AI驱动的设计辅助功能实现路径,以及SKILL语言的进化方向,为工程师提供了未来EDA工具的发展趋势和实用案例。

weixin_28312391的博客 644

(Linux C)利用多进程或多线程模拟实现生产者/消费者问题

(Linux C)利用多进程或多线程模拟实现生产者/消费者问题 去发现同类优质开源项目:https://gitcode.com/ 简介 本仓库包含了一个使用Linux C语言编写的示例程序,该程序展示了如何利用多进程或多线程来模拟经典的生产者/消费者问题。生产者消费者问题是一个多线程编程中常见的问题,用来演示同步机制,如互斥锁、条件变量等的使用。 功能 利用多进程或多线程模拟生产者和消费者的行为...

gitblog_06769的博客 380

YOLOv8改进策略【Neck】| CVPR 2024 MFM(Modulation Fusion Module,调制融合模块):动态特征加权融合,突出关键特征抑制冗余

本文主要利用DCMPNet中的 MFM 模块优化 YOLOv8 的目标检测网络模型。模块通过动态调制特征融合过程,实现了对多尺度、跨层级特征的智能聚合。将其应用于的改进过程中,针对目标检测中边界特征与语义信息的互补性需求,缓解网络中浅层细节与深层语义融合不足的问题。Depth Information Assisted Collaborative Mutual Promotion Network for Single Image Dehazing在图像去雾网络中,不同层级和类型的特征包含着互补的信息(如浅层的

Limiiiing的博客 351

【NVMEM子系统】二、NVMEM驱动框架

该子系统整体架构不算太大,还是比较容易去理解的,下面我们一起去一探究竟!,该子系统主要用于实现EEPROMEfuse等非易失存储器的统一管理。在早期,像EEPROM驱动是存放于目录下,由于没有做到好的抽象,每次需要去访问相应内存空间,都需要去复制几乎一样的代码,去注册sysfs,这是一个相当大的抽象泄露。NVMEM子系统就是为了解决以往的抽象泄露问题。

Donge's Blog 1714

C++模拟“生产者消费者”进程同步问题

#include #include #include #include #include using namespace std; const int limit = 30; //生产总量 const int maxsize = 10; //缓冲区大小 const int kind = 7; int bufIdx = 0; //当前缓冲区下标 string buf[maxs

写代码的高酱 3749

Spring AI Alibaba实战训练营-20 基于注解驱动的MCP快速开发入门指南

本文详细讲解如何使用SpringAiAlibaba快速开发基于注解驱动的MCP应用。文章详细介绍了MCP协议并且重点介绍了Spring AI通过注解驱动的开发方式简化MCP服务开发。具体包括服务端和客户端的注解使用、城市最新时间查询MCP项目结构概览(服务端和客户端模块)以及环境配置要求。

program哲学 294

操作系统实验报告:进程同步问题——模拟生产者消费者问题(java实现)

将curNum(缓冲区中的现有数据量),maxNum(缓冲区中最大数据量),lock(互斥锁)封装在静态mutex类中。生产者在缓冲区满后,进入休眠。直到消费者在缓冲区中消耗数据后,生产者才会被唤醒。消费者在缓冲区空后,进入休眠。直到生产者向缓冲区中添加数据后,消费者才会被唤醒。64 位操作系统, 基于 x64 的处理器 / SublimeText3。每次生产者生产一次或者消费者消费一次,唤醒其他所有线程。模拟生产者消费者问题。

XihuDacuyu的博客 1303

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

生产者/消费者的进程同步模拟

操作系统实验二之进程同步模拟 代码: #include"stdio.h" #include"stdlib.h" #include <process.h> #include"windows.h" #define P(sem) WaitForSingleObject(sem,INFINITE)//P操作,sem为指定线程,INFINITE为等待时间(无限等待) #define V(sem...

huaweiyao的博客 1856

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

进程的互斥与同步——生产者与消费者问题

实验目的 利用Windows提供的API函数,编写程序,解决生产者与消费者问题,实现进程的互斥与同步。 实验步骤与内容 进程的互斥与同步。编写一段程序,模拟生产者和消费者线程,实现进程的互斥与同步。 利用VC++6.0实现上述程序设计和调试操作,对于生产者和消费者线程操作的成功与否提供一定的提示框。 通过阅读和分析实验程序,熟悉进程的互斥与同步的概念。 主要程序结构及注释 #include&l...

szr712的博客 5737

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

上一篇: 汇编语言 十六进制转换为二进制
下一篇: 双重循环打印ASCII的10H到FFH
coderlyf
博客等级 码龄10年 25粉丝 17原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值