首页 生产者消费者实验报告

生产者消费者实验报告

举报
开通vip

生产者消费者实验报告.-.优选-实验二.生产者与消费者进程实验报告实验目的:利用Windows提供的API函数,编写程序,解决生产者与消费者问题,实现进程的互斥与同步。实验内容与步骤:1.进程的互斥与同步。编写一段程序,模拟生产者和消费者线程,实现进程的互斥与同步。2.利用VC++6.0实现上述程序设计和调试操作,对于生产者和消费者线程操作的成功与否提供一定的提示框。3.通过阅读和分析实验程序,熟悉进程的互斥与同步的概念。程序设计思路:关于这个生产者与消费者进程,我主要设计了两个线程,一个生产者线程,一个消费者线程。整个进程随着这两个...

生产者消费者实验报告
.-.优选-实验二.生产者与消费者进程实验报告实验目的:利用Windows提供的API函数,编写程序,解决生产者与消费者问题,实现进程的互斥与同步。实验内容与步骤:1.进程的互斥与同步。编写一段程序,模拟生产者和消费者线程,实现进程的互斥与同步。2.利用VC++6.0实现上述程序设计和调试操作,对于生产者和消费者线程操作的成功与否提供一定的提示框。3.通过阅读和 分析 定性数据统计分析pdf销售业绩分析模板建筑结构震害分析销售进度分析表京东商城竞争战略分析 实验程序,熟悉进程的互斥与同步的概念。程序设计思路:关于这个生产者与消费者进程,我主要设计了两个线程,一个生产者线程,一个消费者线程。整个进程随着这两个线程的创立,运行,终止而进展。在程序的开场,首先我创立了一个构造struct,它包括的根本数据有:生产物品缓冲区〔用队列来 关于同志近三年现实表现材料材料类招标技术评分表图表与交易pdf视力表打印pdf用图表说话 pdf 示〕,一个标志缓冲区空间多少的信号量m_S_Empty,一个标志缓冲区已有物品多少的信号量m_S_Full,一个互斥信号量m_M_Mute*防止生产者与消费者同时访问缓冲区间,一个判断生产者是否要完毕生产的bool类型标志producerfinished,假设为true,则两个线程都终止。进入主程序以后,首先对这些struct中的根本数据进展一个个赋值,然后创立生产者与消费者两个线程,等待两个线程都完毕时,关闭进程。要知道在main主函数中两个线程的创立语句就是对两个线程各自进入函数的运行,生产者函数中通过一个for循环,可以控制生产者进展屡次生产,不是生产一次就完毕了。消费者函数中通过一个while循环,当生产者没有完毕生产时可以控制消费者进展屡次消费,不是消费一次就不会再来消费了,除非生产者已完毕生产,即producerfinished的值变为true。实验主要程序及注释:*include"stdaf*.h"*include*include*include*includeusingnamespacestd;DWORDWINAPIConsumer(void*);//声明消费者函数DWORDWINAPIProducer(void*);//声明生产者函数*defineN10//定义缓冲区数量/*数据构造的定义*/structMyData{HANDLEm_S_Empty;//生产者SemaphoreHANDLEm_S_Full;//消费者SemaphoreHANDLEm_M_Mute*;//互斥信号量queuefood;//定义共享缓冲区boolproducerfinished;//标志着生产者是否完毕生产};intj=0;//只是为了输出方便观察线程执行次数intmain(){/*对各个信号量赋值*/MyDatamydata;//创立一个MyData数据类型的实体mydatamydata.m_M_Mute*=CreateMute*(NULL,false,NULL);//"false"表示刚刚创立的这个信号量不属于®¨²任何线程mydata.m_S_Empty=CreateSemaphore(NULL,N,N,NULL);//初始计数为Nmydata.m_S_Full=CreateSemaphore(NULL,0,N,NULL);//初始计数为0mydata.producerfinished=false;//生产者完毕标志刚开场设置为false,表示没有完毕/*创立生产者和消费者线程*/HANDLEhandles[2];handles[0]=CreateThread(NULL,0,&Producer,(void*)&mydata,0,0);handles[1]=CreateThread(NULL,0,&Consumer,(void*)&mydata,0,0);WaitForMultipleObjects(2,handles,true,INFINITE);//等待两个线程都完毕才往下执行CloseHandle(mydata.m_M_Mute*);CloseHandle(mydata.m_S_Full);CloseHandle(mydata.m_S_Empty);}/*生产者函数*/DWORDWINAPIProducer(void*lp){MyData*md=(MyData*)lp;for(inti=0;i<100;i++){WaitForSingleObject(md->m_S_Empty,INFINITE);//缓冲区有空间才可以往下WaitForSingleObject(md->m_M_Mute*,INFINITE);//消费者没有在操作缓冲区生产者才可以执行/*将所生产的物品放到指定的缓冲区中*/md->food.push(1);printf("%d\t生产1个物品,共有%d个物品\t\t%d\n",j++,md->food.size(),GetCurrentThreadId());//输出缓冲区信息以及线程信息ReleaseMute*(md->m_M_Mute*);//释放互斥信号量ReleaseSemaphore(md->m_S_Full,1,NULL);//有物品的缓冲区增加一个}md->producerfinished=true;//假设出了for循环,生产者完毕生产,控制消费者线程完毕return0;}/*消费者函数*/DWORDWINAPIConsumer(void*lp){MyData*md=(MyData*)lp;while(!md->producerfinished){//假设生产者没有完毕生产,可以继续往下执行WaitForSingleObject(md->m_S_Full,INFINITE);//假设缓冲区没有空,则可以往下执行WaitForSingleObject(md->m_M_Mute*,INFINITE);//假设生产者没有在操作缓冲区,则消费则可以操作/*消费一个物品*/md->food.pop();printf("%d\t消费1个物品,共有%d个物品\t\t%d\n",j++,md->food.size(),GetCurrentThreadId());//输出缓冲区信息以及线程信息ReleaseMute*(md->m_M_Mute*);//释放互斥信号量ReleaseSemaphore(md->m_S_Empty,1,NULL);//空缓冲区增加一个}return0;}实验中遇到的问题及解决:我的这个程序是结合了教师ppt上给的程序框架,然后理解了精品课程上给的程序自己重新整理写的。看教师给的框架一目了然,没有什么大的问题,我先说一下在理解教师给的程序中碰到的问题:1.对于程序的开场(int)(((double)rand()/(double)RAND_MA*)*100)这个不理解是什么意思,后来经过查找资料得知rand()是产生一个随机数,RAND_MA*是随机数中最大的那个数,所以(double)rand()/(double)RAND_MA*一定是产生一个0~1之间的数,在*100则产生的是0~100之间的整数。2.不明白为什么要创立一个struct,把线程中要用到的数据信号量都放在这个数据构造中。经过后来对程序的思考,发现在CreateThread(0,0,&threadProducer,(void*)&mydata,0,0);创立线程的函数中可以直接通过(void*)&mydata将所有线程要使用的数据都传入线程,比拟方便。所以我在自己的程序中也仿照类似的方法,创立了一个数据构造。3.在构造struct中对两个数据的用处比拟迷惑,最后还是在我自己写程序的时候又回过来思考这两个数据才发现他们的用处,首先是boolproducerfinished;我在自己写程序的时候,刚开场没有用到这个变量,所以在消费者线程中没有写while循环,运行以后发现消费者线程在出现一次以后就不会再出现,也是由此我才发现是不是应该要加一个循环,他才会运行屡次,所以我就想到了boolproducerfinished;变量,通过它来控制while循环,当生产者线程完毕后,它的值变为true,消费者不能再次进入消费,否则可以在缓冲区有物品的情况下继续消费。然后就是信号量HANDLEcontrolsemaphore;在我自己的程序中没有用到这个变量。不过我还是很好奇它的用处,然后我发现教师的程序在判断food().size>0的时候才可以消费,假设不大于0,则必须要经过生产者生产以后也就是说释放一个HANDLEcontrolsemaphore以后,消费者才能继续消费,防止生产者不生产,消费者盲目得在等待。4.对于WaitForMultipleObjects(3,handles,true,INFINITE);语句不理解,查阅资料以后发现他的意思true是要等到3个线程都完毕以后才能往下执行,假设为false,则其中一个线程完毕了就可以往下执行。实验结果截图:
本文档为【生产者消费者实验报告】,请使用软件OFFICE或WPS软件打开。作品中的文字与图均可以修改和编辑, 图片更改请在作品中右键图片并更换,文字修改请直接点击文字进行修改,也可以新增和删除文档中的内容。
该文档来自用户分享,如有侵权行为请发邮件ishare@vip.sina.com联系网站客服,我们会及时删除。
[版权声明] 本站所有资料为用户分享产生,若发现您的权利被侵害,请联系客服邮件isharekefu@iask.cn,我们尽快处理。
本作品所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用。
网站提供的党政主题相关内容(国旗、国徽、党徽..)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。
下载需要: 免费 已有0 人下载
最新资料
资料动态
专题动态
个人认证用户
阳光心态
在单位培训
格式:doc
大小:41KB
软件:Word
页数:4
分类:教育学
上传时间:2022-07-10
浏览量:0