logo资料库

生产者与消费者问题.doc

第1页 / 共8页
第2页 / 共8页
第3页 / 共8页
第4页 / 共8页
第5页 / 共8页
第6页 / 共8页
第7页 / 共8页
第8页 / 共8页
资料共8页,全文预览结束
操作系统实验报告 操作系统实验报告 操作系统实验报告 实验名称:生产者与消费者问题 班级: 姓名: 学号: 时间: 1
一、实验目的 全面理解生产者与消费者问题模型,掌握解决该问题的算法思想,正确使用同步机制 二、实验内容 三个生产者向两个消费者提供消息,它们共享一个有界缓冲池,缓冲池有四个缓冲区,生产者向其中 投放消息,消费者从中取得消息。假定这些生产者和消费者互相等效,只要缓冲池未满,生产者可将消息 送入缓冲池;只要缓冲池未空,消费者可从缓冲池取走一个消息。每个缓冲设有一个所标记,生产者在生 产产品以前要先判断缓冲区是否已上锁,消费者在消费产品之前也要进行判断。 三、算法思想和流程图 主要流程: 1、 生产者进程生产流程图,如图 1 所示 否 是 阻 塞 开 始 是否有空缓冲区? 是 该缓冲区是否 已上锁? 否 对该缓冲区上锁 模拟生产 解 锁 结 束 图 1 生产者进程生产流程图 2
2、消费者进程消费流程图,如图 2 所示 否 是 阻 塞 开 始 是否有满缓冲区? 是 该缓冲区是否 已上锁? 否 对该缓冲区上锁 模拟消费 解 锁 结 束 图 2 消费者进程消费流程图 四、程序代码 bool lock[4]={false,false,false,false};//四把锁,分别对四个缓冲区进行控制 int buffer[4]={0,0,0,0};//缓冲区个数为 4 1、生产者生产进程函数 DWORD WINAPI Producer(LPVOID lpParameter){ while(true){ for(int j=0;j<4;j++){ if(buffer[j]==0){//找到空缓冲区 if(lock[j]==false){//同步锁为 false,可以进行操作 lock[j]=true;//加锁,防止其他线程操作此缓冲区 3
if(buffer[j]<1){//限定一个缓冲区只能存放一个资源 ++buffer[j];//模拟生产资源 cout<<"生产一个资源,放入缓冲区"<=1){ --buffer[n];//模拟消费资源 cout<<"消费一个资源,从缓冲区"<
handle[3]=CreateThread(NULL,0,Customer,NULL,0,&dw4); handle[4]=CreateThread(NULL,0,Customer,NULL,0,&dw5); } 附: #include "iostream.h" #include "windows.h" #include "stdio.h" bool lock[4]={false,false,false,false};//四把锁,分别对四个缓冲区进行同步 int buffer[4]={0,0,0,0};//缓冲区,表示资源的个数 void display(){ cout<<"--------------------------------"<
for(int n=0;n<4;n++){ if(buffer[n]==1){//找到满缓冲区 if(lock[n]==false){//同步锁为 false,可以进行操作 lock[n]=true;//加锁,防止其他线程操作此缓冲区 if(buffer[n]>=1){ --buffer[n];//模拟消费资源 cout<<"消费一个资源,从缓冲区"<
1、一个生产者生产,一个消费者消费: 2、 两个生产者连续生产,两个消费者连续消费: 3、 多个生产者于多个消费者进行生产消费操作: } 六、实验分析 这次多线程的操作系统实验,使我对线程的概念以及多线程程序中线程间的运行有了更深的认识,同 时也让我的编程能力得到了一定的提高。 这次做的用多线程实现生产者与消费者模型的实验,由于我的编程能力基础比较差,对线程也是一无 7
所知,所以一开始觉得无从下手,但幸好老师给了充足的时间,我通过看网上找的视频资料以及请教同学 才渐渐地有了一点概念,然后我试着从网上下了一些多线程的程序分析里面的语句,基本弄懂了多线程的 原理。 8
分享到:
收藏