ImageVerifierCode 换一换
格式:DOCX , 页数:9 ,大小:352.50KB ,
资源ID:7343957      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bdocx.com/down/7343957.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(生产者消费者实验报告.docx)为本站会员(b****5)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

生产者消费者实验报告.docx

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

2、了一个结构struct,它包括的基本数据有:生产物品缓冲区(用队列来表示),一个标志缓冲区空间多少的信号量m_S_Empty,一个标志缓冲区已有物品多少的信号量m_S_Full,一个互斥信号量m_M_Mutex防止生产者与消费者同时访问缓冲区间,一个判断生产者是否要结束生产的bool类型标志producerfinished,若为true,则两个线程都终止。进入主程序以后,首先对这些struct中的基本数据进行一个个赋值,然后创建生产者与消费者两个线程,等待两个线程都结束时,关闭进程。要知道在main主函数中两个线程的创建语句就是对两个线程各自进入函数的运行,生产者函数中通过一个for循环,可以

3、控制生产者进行多次生产,不是生产一次就结束了。消费者函数中通过一个while循环,当生产者没有结束生产时可以控制消费者进行多次消费,不是消费一次就不会再来消费了,除非生产者已结束生产,即producerfinished的值变为true。实验主要程序及注释:#include stdafx.h#include #include #include #include using namespace std;DWORD WINAPI Consumer(void*);/声明消费者函数DWORD WINAPI Producer(void*);/声明生产者函数#define N 10/定义缓冲区数量/*数据结

4、构的定义*/struct MyDataHANDLE m_S_Empty;/ 生产者SemaphoreHANDLE m_S_Full; / 消费者SemaphoreHANDLE m_M_Mutex;/互斥信号量queue food; /定义共享缓冲区bool producerfinished;/标志着生产者是否结束生产;int j=0;/只是为了输出方便观察线程执行次数int main() /*对各个信号量赋值*/MyData mydata;/创建一个MyData数据类型的实体mydatamydata.m_M_Mutex = CreateMutex(NULL, false, NULL);/fal

5、se表示刚刚创建的这个信号量不属于任何线程mydata.m_S_Empty = CreateSemaphore(NULL, N, N, NULL);/初始计数为N mydata.m_S_Full = CreateSemaphore(NULL, 0, N, NULL);/初始计数为0mydata.producerfinished=false;/生产者结束标志刚开始设置为false,表示没有结束/*创建生产者和消费者线程*/ HANDLE handles2; handles0 = CreateThread(NULL,0,&Producer,(void*)&mydata,0,0); handles1

6、 = CreateThread(NULL,0,&Consumer,(void*)&mydata,0,0); WaitForMultipleObjects(2, handles, true, INFINITE); /等待两个线程都结束才往下执行 CloseHandle(mydata.m_M_Mutex); CloseHandle(mydata.m_S_Full); CloseHandle(mydata.m_S_Empty);/*生产者函数*/DWORD WINAPI Producer(void* lp) MyData * md = (MyData*)lp; for(int i =0 ; i m_

7、S_Empty, INFINITE);/缓冲区有空间才可以往下 WaitForSingleObject(md-m_M_Mutex, INFINITE);/消费者没有在操作缓冲区生产者才可以执行 /*将所生产的物品放到指定的缓冲区中*/ md-food.push(1); printf(%dt生产1个物品,共有%d个物品tt%dn,j+,md-food.size(),GetCurrentThreadId();/输出缓冲区信息以及线程信息 ReleaseMutex(md-m_M_Mutex);/释放互斥信号量 ReleaseSemaphore(md-m_S_Full, 1, NULL);/有物品的缓

8、冲区增加一个 md-producerfinished=true;/若出了for循环,生产者结束生产,控制消费者线程结束 return 0;/*消费者函数*/DWORD WINAPI Consumer(void* lp) MyData * md = (MyData*)lp;while(!md-producerfinished)/若生产者没有结束生产,可以继续往下执行 WaitForSingleObject(md-m_S_Full,INFINITE);/若缓冲区没有空,则可以往下执行 WaitForSingleObject(md-m_M_Mutex,INFINITE);/若生产者没有在操作缓冲区,

9、则消费则可以操作/*消费一个物品*/ md-food.pop();printf(%dt消费1个物品,共有%d个物品tt%dn,j+,md-food.size(),GetCurrentThreadId();/输出缓冲区信息以及线程信息ReleaseMutex(md-m_M_Mutex); /释放互斥信号量 ReleaseSemaphore(md-m_S_Empty,1,NULL);/空缓冲区增加一个return 0;实验中遇到的问题及解决:我的这个程序是结合了老师ppt上给的程序框架,然后理解了精品课程上给的程序自己重新整理写的。看老师给的框架一目了然,没有什么大的问题,我先说一下在理解老师给的

10、程序中碰到的问题:1.对于程序的开始(int)(double)rand()/(double)RAND_MAX)*100)这个不理解是什么意思,后来经过查找资料得知rand()是产生一个随机数,RAND_MAX是随机数中最大的那个数,所以(double)rand()/(double)RAND_MAX一定是产生一个01之间的数,在*100则产生的是0100之间的整数。2.不明白为什么要创建一个struct,把线程中要用到的数据信号量都放在这个数据结构中。经过后来对程序的思考,发现在CreateThread(0,0,&threadProducer,(void*)&mydata, 0,0);创建线程的

11、函数中可以直接通过(void*)&mydata将所有线程要使用的数据都传入线程,比较方便。所以我在自己的程序中也仿照类似的方法,创建了一个数据结构。3.在结构struct中对两个数据的用处比较迷惑,最后还是在我自己写程序的时候又回过来思考这两个数据才发现他们的用处,首先是bool producerfinished;我在自己写程序的时候,刚开始没有用到这个变量,所以在消费者线程中没有写while循环,运行以后发现消费者线程在出现一次以后就不会再出现,也是由此我才发现是不是应该要加一个循环,他才会运行多次,所以我就想到了bool producerfinished;变量,通过它来控制while循环,

12、当生产者线程结束后,它的值变为true,消费者不能再次进入消费,否则可以在缓冲区有物品的情况下继续消费。然后就是信号量HANDLE controlsemaphore;在我自己的程序中没有用到这个变量。不过我还是很好奇它的用处,然后我发现老师的程序在判断food().size0的时候才可以消费,若不大于0,则必须要经过生产者生产以后也就是说释放一个HANDLE controlsemaphore以后,消费者才能继续消费,防止生产者不生产,消费者盲目得在等待。4.对于WaitForMultipleObjects(3, handles, true, INFINITE);语句不理解,查阅资料以后发现他的意思true是要等到3个线程都结束以后才能往下执行,若为false,则其中一个线程结束了就可以往下执行。实验结果截图:

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1