您好,欢迎访问三七文档
当前位置:首页 > 商业/管理/HR > 销售管理 > 生产者与消费者多线程模拟
操作系统课程实验报告课程名称:操作系统实验项目名称:生产者-消费者问题实现专业班级:智能1302姓名:匿名学号:201308070221完成时间:2015年12月2日一.实习内容本次实验要求完成下列内容:模拟操作系统中进程同步和互斥。二、实验目的•熟悉临界资源、信号量及PV操作的定义与物理意义•了解进程通信的方法•掌握进程互斥与进程同步的相关知识•掌握用信号量机制解决进程之间的同步与互斥问题•实现生产者-消费者问题,深刻理解进程同步问题三.实验题目实现经典同步问题:生产者—消费者,具体要求如下可以采用C++或者java编程)(1)一个大小为10的缓冲区,初始状态为空。(2)2个生产者,随机等待一段时间,往缓冲区中添加数据,若缓冲区已满,等待消费者取走数据之后再添加,重复10次。(3)2个消费者,随机等待一段时间,从缓冲区中读取数据,若缓冲区为空,等待生产者添加数据之后再读取,重复10次。四.提示•本实验的主要目的是模拟操作系统中进程同步和互斥。在系统进程并发执行异步推进的过程中,由于资源共享和进程间合作而造成进程间相互制约。进程间的相互制约有两种不同的方式。(1)间接制约。这是由于多个进程共享同一资源(如CPU、共享输入/输出设备)而引起的,即共享资源的多个进程因系统协调使用资源而相互制约。(2)直接制约。只是由于进程合作中各个进程为完成同一任务而造成的,即并发进程各自的执行结果互为对方的执行条件,从而限制各个进程的执行速度。生产者和消费者是经典的进程同步问题,在这个问题中,生产者不断的向缓冲区中写入数据,而消费者则从缓冲区中读取数据。生产者进程和消费者对缓冲区的操作是互斥,即当前只能有一个进程对这个缓冲区进行操作,生产者进入操作缓冲区之前,先要看缓冲区是否已满,如果缓冲区已满,则它必须等待消费者进程将数据取出才能写入数据,同样的,消费者进程从缓冲区读取数据之前,也要判断缓冲区是否为空,如果为空,则必须等待生产者进程写入数据才能读取数据。五.源代码实现:packagethread;/**多线程有关的以生产者消费者问题为原型的Java程序源码。*开启五个生产者和五个消费者线程,对大小为10的缓冲区进行操作,要做到缓冲区产品达到5的时候,生产者线程阻塞,*直到消费者线程减少缓冲区的产品数量,并对阻塞进程进行唤醒*/importjava.util.concurrent.ExecutorService;importjava.util.concurrent.Executors;classmyProducerimplementsRunnable{privatemyProAndConmpc;myProducer(myProAndConmpac){this.mpc=mpac;}publicvoidrun(){try{while(!Thread.interrupted()){//生产者互斥synchronized(this){//静态计数值达到上限,则wait()阻塞,等待被消费者线程唤醒while(mpc.get()=5){System.out.println(仓储容量不足!);this.wait();}Thread.sleep(2000);//未发生阻塞时,向缓冲区内放入产品,增加计数值,并唤醒所有阻塞的消费者线程synchronized(mpc.c){System.out.println(生产者生产产品数量为:+mpc.inc());mpc.c.notifyAll();}}}}catch(InterruptedExceptione){//TODOAuto-generatedcatchblocke.printStackTrace();}}}classmyConsumerimplementsRunnable{privatemyProAndConmpc;myConsumer(myProAndConmpac){this.mpc=mpac;}publicvoidrun(){try{while(!Thread.interrupted()){//消费者互斥synchronized(this){//当缓冲区无产品时,消费者线程阻塞,等待被生产者线程唤醒while(mpc.get()=0){System.out.println(缓存区没有产品,消费者线程阻塞!!!);this.wait();}}Thread.sleep(2500);//未发生阻塞时,从缓冲区取出产品,减少计数值,并唤醒所有阻塞的生产者线程synchronized(mpc.p){System.out.println(消费者消费商品数量为:+mpc.dec());mpc.p.notifyAll();}}}catch(InterruptedExceptione){//TODOAuto-generatedcatchblocke.printStackTrace();}}}publicclassmyProAndCon{//缓冲区计数器(静态)以及对其进行的三个synchronized操作volatileprivatestaticintcounter=0;synchronizedstaticintinc(){return++counter;}synchronizedstaticintdec(){returncounter-=1;}synchronizedstaticintget(){returncounter;}//构造两个对象,作为开启线程的参数publicmyConsumerc=newmyConsumer(this);publicmyProducerp=newmyProducer(this);privateExecutorServiceexec=Executors.newCachedThreadPool();publicmyProAndCon(){//打开五个生产者线程for(inti=0;i5;i++)exec.execute(p);//打开五个消费者线程for(inti=0;i5;i++)exec.execute(c);}//主函数调用myProAndCon类构造方法,开始执行各个线程publicstaticvoidmain(String[]s){newmyProAndCon();}}•运行结果:
本文标题:生产者与消费者多线程模拟
链接地址:https://www.777doc.com/doc-5370861 .html