生产者与消费者问题(附源码)_第1页
生产者与消费者问题(附源码)_第2页
生产者与消费者问题(附源码)_第3页
生产者与消费者问题(附源码)_第4页
生产者与消费者问题(附源码)_第5页
已阅读5页,还剩3页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、精选优质文档-倾情为你奉上操作系统实验报告专业 网络工程 班级 08102 学号 姓名 课程名称操作系统 学年 20102011 学期 下课程类别专业必修 限选任选实践实验时间 2010年11月3日实验名称实验一:生产者与消费者问题实验目的和要求全面理解生产者与消费者问题模型,掌握解决该问题的算法思想,正确使用同步机制。实验软硬件要求Pentium | 450以上 CPU 64MB以上 内存WINDOWS XP Visual C+6.0实验内容、方法和步骤(可附页)问题描述:一组生产者向一组消费者提供商品,共享一个有界缓冲池,生产者向其中放入商品,消费者从中取得商品。假定这些生产者和消费者互相

2、等效,只要缓冲池未满,生产者可将商品送入缓冲池;只要缓冲池未空,消费者可从缓冲池取走一商品。功能要求:根据进程同步机制,编写一个解决上述问题的程序,可显示缓冲池状态、放商品、取商品等过程。具体参数:3个生产者进程,2个消费者进程; 缓冲区单元个数N=4;在本程序中是缓冲区中的数从0变为1表示模拟生产一个产品,消费时则将对应缓冲区内的1变为0,为模拟消费一个产品。实验结果(可附页)见截图小结这次多线程的操作系统实验,使我对线程的概念以及多线程程序中线程间的运行有了更深的认识,同时也让我的编程能力得到了一定的提高。这次做的用多线程实现生产者与消费者模型的实验,由于我的编程能力基础比较差,对线程也是

3、一无所知,所以一开始觉得无从下手,但幸好老师给了充足的时间,我通过看网上找的视频资料以及请教同学才渐渐地有了一点概念,然后我试着从网上下了一些多线程的程序分析里面的语句,基本弄懂了多线程的原理。评定成绩:批阅教师: 年月日 一、问题概述三个生产者向两个消费者提供消息,它们共享一个有界缓冲池,缓冲池有四个缓冲区,生产者向其中投放消息,消费者从中取得消息。假定这些生产者和消费者互相等效,只要缓冲池未满,生产者可将消息送入缓冲池;只要缓冲池未空,消费者可从缓冲池取走一个消息。每个缓冲设有一个所标记,生产者在生产产品以前要先判断缓冲区是否已上锁,消费者在消费产品之前也要进行判断。二、 设计流程图主要流

4、程: 1、 生产者进程生产流程图,如图1所示开 始是该缓冲区是否已上锁?是否有空缓冲区?否是对该缓冲区上锁模拟生产解 锁结 束阻 塞否图1 生产者进程生产流程图2、 消费者进程消费流程图,如图2所示开 始是该缓冲区是否已上锁?是否有满缓冲区?否是对该缓冲区上锁模拟消费解 锁结 束阻 塞否图2 消费者进程消费流程图三、数据定义bool lock4=false,false,false,false;/四把锁,分别对四个缓冲区进行控制int buffer4=0,0,0,0;/缓冲区个数为44、 源程序1、生产者生产进程函数DWORD WINAPI Producer(LPVOID lpParameter

5、)while(true)for(int j=0;j<4;j+)if(bufferj=0)/找到空缓冲区if(lockj=false)/同步锁为false,可以进行操作lockj=true;/加锁,防止其他线程操作此缓冲区if(bufferj<1)/限定一个缓冲区只能存放一个资源+bufferj;/模拟生产资源cout<<"生产一个资源,放入缓冲区"<<j<<"中"<<endl;lockj=false;/解锁break;/一次生产一个if(j=3)cout<<"找不到空缓冲区

6、,等待中。"<<endl;Sleep(2000);return 0;2、消费者消费进程函数DWORD WINAPI Customer(LPVOID lpParameter)while(true)for(int n=0;n<4;n+)if(buffern=1)/找到满缓冲区if(lockn=false)/同步锁为false,可以进行操作lockn=true;/加锁,防止其他线程操作此缓冲区if(buffern>=1)-buffern;/模拟消费资源cout<<"消费一个资源,从缓冲区"<<n<<"

7、中取出"<<endl;lockn=false;/解锁break;/一次生产一个if(n=3) cout<<"找不到满缓冲区,等待中。"<<endl; Sleep(2000);3、主函数,创建5个进程,其中3个生产者进程,2个消费者进程int main(int argc,char* argv) HANDLE handle3;DWORD dw1,dw2,dw3,dw4,dw5;/创建5个进程 handle0=CreateThread(NULL,0,Producer,NULL,0,&dw1); handle1=CreateTh

8、read(NULL,0,Producer,NULL,0,&dw2); handle2=CreateThread(NULL,0,Producer,NULL,0,&dw3); handle3=CreateThread(NULL,0,Customer,NULL,0,&dw4); handle4=CreateThread(NULL,0,Customer,NULL,0,&dw5);5、 运行结果3个生产者2个消费者,共享4个缓冲区,运行结果如下:1、一个生产者生产,一个消费者消费:2、 两个生产者连续生产,两个消费者连续消费:3、 多个生产者于多个消费者进行生产消费操作:

9、附:#include "iostream.h"#include "windows.h"#include "stdio.h"bool lock4=false,false,false,false;/四把锁,分别对四个缓冲区进行同步int buffer4=0,0,0,0;/缓冲区,表示资源的个数void display() cout<<"-"<<endl; cout<<"缓冲区 0 1 2 3"<<endl; for(int i=0;i<4;i+)

10、cout<<" "<<bufferi<<" " cout<<endl;DWORD WINAPI Producer(LPVOID lpParameter)while(true)for(int j=0;j<4;j+)if(bufferj=0)/找到空缓冲区if(lockj=false)/同步锁为false,可以进行操作lockj=true;/加锁,防止其他线程操作此缓冲区if(bufferj<1)/限定一个缓冲区只能存放一个资源+bufferj;/模拟生产资源cout<<"生产

11、一个资源,放入缓冲区"<<j<<"中"<<endl;lockj=false;/解锁break;/一次生产一个if(j=3)cout<<"找不到空缓冲区,等待中。"<<endl;Sleep(2000);return 0;DWORD WINAPI Customer(LPVOID lpParameter)while(true)for(int n=0;n<4;n+)if(buffern=1)/找到满缓冲区if(lockn=false)/同步锁为false,可以进行操作lockn=true

12、;/加锁,防止其他线程操作此缓冲区if(buffern>=1)-buffern;/模拟消费资源cout<<"消费一个资源,从缓冲区"<<n<<"中取出"<<endl;lockn=false;/解锁break;/一次生产一个if(n=3) cout<<"找不到满缓冲区,等待中。"<<endl; Sleep(2000);return 0;int main(int argc,char* argv) display();HANDLE handle3;DWORD dw1,dw2,dw3,dw4,dw0; handle0=CreateThread(NULL,0,Producer,NULL,0,&dw1); handle1=CreateThread(NULL,0,Producer,NULL,0,&dw2); handle2=CreateThread

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

最新文档

评论

0/150

提交评论