您好,欢迎访问三七文档
当前位置:首页 > 商业/管理/HR > 销售管理 > 生产者与消费者问题(附源码)
1操操操作作作系系系统统统实实实验验验报报报告告告专业网络工程班级08102学号姓名课程名称操作系统学年2010-2011学期下课程类别专业必修■限选□任选□实践□实验时间2010年11月3日实验名称实验一:生产者与消费者问题实验目的和要求全面理解生产者与消费者问题模型,掌握解决该问题的算法思想,正确使用同步机制。实验软硬件要求Pentium|||450以上CPU64MB以上内存WINDOWSXPVisualC++6.0实验内容、方法和步骤(可附页)问题描述:一组生产者向一组消费者提供商品,共享一个有界缓冲池,生产者向其中放入商品,消费者从中取得商品。假定这些生产者和消费者互相等效,只要缓冲池未满,生产者可将商品送入缓冲池;只要缓冲池未空,消费者可从缓冲池取走一商品。功能要求:根据进程同步机制,编写一个解决上述问题的程序,可显示缓冲池状态、放商品、取商品等过程。具体参数:3个生产者进程,2个消费者进程;缓冲区单元个数N=4;在本程序中是缓冲区中的数从0变为1表示模拟生产一个产品,消费时则将对应缓冲区内的1变为0,为模拟消费一个产品。实验结果(可附页)见截图小结这次多线程的操作系统实验,使我对线程的概念以及多线程程序中线程间的运行有了更深的认识,同时也让我的编程能力得到了一定的提高。这次做的用多线程实现生产者与消费者模型的实验,由于我的编程能力基础比较差,对线程也是一无所知,所以一开始觉得无从下手,但幸好老师给了充足的时间,我通过看网上找的视频资料以及请教同学才渐渐地有了一点概念,然后我试着从网上下了一些多线程的程序分析里面的语句,基本弄懂了多线程的原理。评定成绩:批阅教师:年月日2一、问题概述三个生产者向两个消费者提供消息,它们共享一个有界缓冲池,缓冲池有四个缓冲区,生产者向其中投放消息,消费者从中取得消息。假定这些生产者和消费者互相等效,只要缓冲池未满,生产者可将消息送入缓冲池;只要缓冲池未空,消费者可从缓冲池取走一个消息。每个缓冲设有一个所标记,生产者在生产产品以前要先判断缓冲区是否已上锁,消费者在消费产品之前也要进行判断。二、设计流程图主要流程:1、生产者进程生产流程图,如图1所示图1生产者进程生产流程图开始是该缓冲区是否已上锁?是否有空缓冲区?否是对该缓冲区上锁模拟生产解锁结束阻塞否32、消费者进程消费流程图,如图2所示图2消费者进程消费流程图三、数据定义boollock[4]={false,false,false,false};//四把锁,分别对四个缓冲区进行控制intbuffer[4]={0,0,0,0};//缓冲区个数为4四、源程序1、生产者生产进程函数DWORDWINAPIProducer(LPVOIDlpParameter){while(true){for(intj=0;j4;j++){if(buffer[j]==0){//找到空缓冲区if(lock[j]==false){//同步锁为false,可以进行操作lock[j]=true;//加锁,防止其他线程操作此缓冲区if(buffer[j]1){//限定一个缓冲区只能存放一个资源开始是该缓冲区是否已上锁?是否有满缓冲区?否是对该缓冲区上锁模拟消费解锁结束阻塞否4++buffer[j];//模拟生产资源cout生产一个资源,放入缓冲区j中endl;lock[j]=false;//解锁break;//一次生产一个}}if(j==3){cout找不到空缓冲区,等待中。。endl;Sleep(2000);}}}}return0;}2、消费者消费进程函数DWORDWINAPICustomer(LPVOIDlpParameter){while(true){for(intn=0;n4;n++){if(buffer[n]==1){//找到满缓冲区if(lock[n]==false){//同步锁为false,可以进行操作lock[n]=true;//加锁,防止其他线程操作此缓冲区if(buffer[n]=1){--buffer[n];//模拟消费资源cout消费一个资源,从缓冲区n中取出endl;lock[n]=false;//解锁break;//一次生产一个}}}if(n==3){cout找不到满缓冲区,等待中。。endl;Sleep(2000);}}}}3、主函数,创建5个进程,其中3个生产者进程,2个消费者进程intmain(intargc,char*argv[]){HANDLEhandle[3];DWORDdw1,dw2,dw3,dw4,dw5;//创建5个进程handle[0]=CreateThread(NULL,0,Producer,NULL,0,&dw1);handle[1]=CreateThread(NULL,0,Producer,NULL,0,&dw2);handle[2]=CreateThread(NULL,0,Producer,NULL,0,&dw3);handle[3]=CreateThread(NULL,0,Customer,NULL,0,&dw4);5handle[4]=CreateThread(NULL,0,Customer,NULL,0,&dw5);}五、运行结果3个生产者2个消费者,共享4个缓冲区,运行结果如下:1、一个生产者生产,一个消费者消费:2、两个生产者连续生产,两个消费者连续消费:3、多个生产者于多个消费者进行生产消费操作:附:6#includeiostream.h#includewindows.h#includestdio.hboollock[4]={false,false,false,false};//四把锁,分别对四个缓冲区进行同步intbuffer[4]={0,0,0,0};//缓冲区,表示资源的个数voiddisplay(){cout--------------------------------endl;cout缓冲区0123endl;for(inti=0;i4;i++){coutbuffer[i];}coutendl;}DWORDWINAPIProducer(LPVOIDlpParameter){while(true){for(intj=0;j4;j++){if(buffer[j]==0){//找到空缓冲区if(lock[j]==false){//同步锁为false,可以进行操作lock[j]=true;//加锁,防止其他线程操作此缓冲区if(buffer[j]1){//限定一个缓冲区只能存放一个资源++buffer[j];//模拟生产资源cout生产一个资源,放入缓冲区j中endl;lock[j]=false;//解锁break;//一次生产一个}}if(j==3){cout找不到空缓冲区,等待中。。endl;Sleep(2000);}}}}return0;}DWORDWINAPICustomer(LPVOIDlpParameter){while(true){for(intn=0;n4;n++){if(buffer[n]==1){//找到满缓冲区if(lock[n]==false){//同步锁为false,可以进行操作lock[n]=true;//加锁,防止其他线程操作此缓冲区7if(buffer[n]=1){--buffer[n];//模拟消费资源cout消费一个资源,从缓冲区n中取出endl;lock[n]=false;//解锁break;//一次生产一个}}}if(n==3){cout找不到满缓冲区,等待中。。endl;Sleep(2000);}}}return0;}intmain(intargc,char*argv[]){display();HANDLEhandle[3];DWORDdw1,dw2,dw3,dw4,dw0;handle[0]=CreateThread(NULL,0,Producer,NULL,0,&dw1);handle[1]=CreateThread(NULL,0,Producer,NULL,0,&dw2);handle[2]=CreateThread(NULL,0,Producer,NULL,0,&dw3);handle[3]=CreateThread(NULL,0,Customer,NULL,0,&dw4);handle[4]=CreateThread(NULL,0,Customer,NULL,0,&dw0);display();Sleep(3000);display();return0;}
本文标题:生产者与消费者问题(附源码)
链接地址:https://www.777doc.com/doc-4905711 .html