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

加入VIP,免费下载
 

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

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

下载须知

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

版权提示 | 免责声明

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

消费者与生产者问题Word格式文档下载.docx

1、3.1 任务名称 123.2 主要功能 123.3 遇到的问题 124.心得体会 12题目:生产者-消费者问题的模拟实现 一、用户文档(1)设计原理通过一个有界缓冲区把生产者和消费者联系起来。假定生产者和消费者的优先级是相同的,只要缓冲区未满,生产者就可以生产产品并将产品送入缓冲区。类似地,只要缓冲区未空,消费者就可以从缓冲区中取走产品。应该禁止生产者向满的缓冲区送入产品,同时也应该禁止消费者从空的缓冲区中取出产品,这一机制有生产者线程和消费者线程之间的互斥关系来实现。与计算打印两进程同步关系相同,生产者和消费者两进程P和C之间应满足下列两个同步条件:1 只有在缓冲池中至少有一个缓冲区已存入消

2、息后,消费者才能从中提取信息,否则消费者必须等待。2 只有缓冲池中至少有一个缓冲区是空时,生产者才能把消息放入缓冲区,否则生产者必须等待。为了满足第一个同步条件,设置一个同步信号量full,它代表的资源是缓冲区满,它的初始值为0,它的值为n时整个缓冲池满。这个资源是消费者类进程C所有,C进程可以申请该资源,对它施加P操作,而C进程的合作进程生产者进程P对它施加V操作。同样为了满足第二个同步条件,设置另一个同步信号量empty,它代表的资源是缓冲空区,它的初始值为n,表示缓冲池中所有缓冲区空。信号量full表示可用缓冲区数量,信号量empty表示缓冲区数量,设置整型变量:存入指针in和取出指针o

3、ut。为解决生产者/消费者问题,应该设置两个资源信号量,其中一个表示空缓冲区的数目,用g_hFullSemaphore表示,其初始值为有界缓冲区的大小SIZE_OF_BUFFER;另一个表示缓冲区中产品的数目,用g_hEmptySemaphore表示,其初始值为0.另外,由于有界缓冲区是一个临界资源,必须互斥使用,所以还需要在设置一个互斥信号量g_hMutex,初始值为1.P原语的主要动作是:1 sem减1;2 若sem减一后仍大于或等于零,则进程继续执行;3 若sem减一后小于零,则该进程被阻塞后入与该信号相对应的队列中,然后转进程调度。V原语的操作主要动作是:1 sem加1;2 若相加结果

4、大于零,进程继续执行;若相加结果小于或等于零,则从该信号的等待队列中唤醒一等待进程然后再返回原进程继续执行或转进程调度。采用的同步方法:1)利用函数CreateMutex(NULL,FALSE,NULL)创建互斥信号量g_hMutex,表示缓冲区当前的状态,若为true时,则表示缓冲区正被别的进程使用。三个参数表示的意义分别为:指向安全属性的指针,初始化互斥对象的所有者,指向互斥对象名的指针。2)利用函数CreateSemaphore(NULL,SIZE_OF_BUFFER-1,SIZE_OF_BUFFER-1,NULL)创建缓冲区满的信号量g_hFullSemaphore,值为true时表示

5、缓冲区已满。四个参数分别为:表示是否允许继承、设置信号机的初始计数、设置信号机的最大计数、指定信号机对象的名称(-1是因为计数从开始)。3)利用函数CreateSemaphore(NULL,0,SIZE_OF_BUFFER-1,NULL)创建缓冲区空的信号量g_hEmptySemaphore,该值为true时表示缓冲区为空。(2)数据定义及其详细解释const unsigned short SIZE_OF_BUFFER = 20; /缓冲区长度 unsigned short ProductID = 0; /产品号 unsigned short ConsumeID = 0; /将被消耗的产品号

6、unsigned short in = 0; /产品进缓冲区时的缓冲区下标 unsigned short out = 0; /产品出缓冲区时的缓冲区下标 int g_bufferSIZE_OF_BUFFER; /缓冲区是个循环队列 bool g_continue = true; /使程序跳出循环,控制程序结束 HANDLE g_hMutex; /用于线程间的互斥 HANDLE g_hFullSemaphore; /当缓冲区满时迫使生产者等待 HANDLE g_hEmptySemaphore; /当缓冲区空时迫使消费者等待 DWORD WINAPI Producer(LPVOID); /生产者线

7、程 DWORD WINAPI Consumer(LPVOID); /消费者线程 (3)课程设计的实验环境本实验是在硬件:个人电脑;软件:操作系统:Windows 7;开发语言: VC+ VS2012;(4)编译软件(1) 打开VC,选择菜单项file-new,选择projects选项卡并建立一个win32 console applicatoin工程;创建时注意指定创建该工程的目录;(2) 在工程中创建源文件 R_WP1.cpp:选择菜单项project-add to project-files,在选择框中输入自己想要创建的文件名,这里是;在接下来询问是否创建新文件时回答yes然后通过Works

8、pace-FileView-Source Files打开该文件,在其中编辑源文件并保存.(3) 通过调用菜单命令项build-build all进行编译连接,可以在指定的工程目录下得到debug- R_WP1.exe程序,然后把给定的test.txt文件存入该debug目录下,就可以在控制台进入该debug目录运行程序了。需要强调的是在创建数据文件时,由于涉及到文件格式问题,最好在记事本中手工逐个输入数据,而不要拷贝粘贴数据。二、技术文档(1)流程图生产者:消费者:(2)算法及相关函数 /创建各个互斥信号 g_hMutex = CreateMutex(NULL,FALSE,NULL); /互斥

9、信号量,三个参数表示的意义分别为: g_hFullSemaphore = CreateSemaphore(NULL,0,SIZE_OF_BUFFER-1,NULL); /同步信号量,缓冲区满,四个参数分别为:表示是否允许继承、设置信号机的初始计数、设置信号机的最大计数、指定信号机对象的名称。 g_hEmptySemaphore = CreateSemaphore(NULL,SIZE_OF_BUFFER-1,SIZE_OF_BUFFER-1,NULL); /同步信号量,缓冲区空 四个参数分别为: /创建生产者线程 for (int i=0;iPRODUCERS_COUNT;+i) hThread

10、si=CreateThread(NULL,0,Producer,NULL,0,&producerIDi); if (hThreadsi=NULL) return -1; /创建消费者线程CONSUMERS_COUNT; hThreadsPRODUCERS_COUNT+i=CreateThread(NULL,0,Consumer,NULL,0,&consumerIDi);/生产一个产品、输出新产品的ID号void Produce() std:cerr Producing a product +ProductID 号产品 endl; /把新生产的产品放入缓冲区void Append()Append

11、ing a product ProductID g_bufferin = ProductID; in = (in+1)%SIZE_OF_BUFFER; /输出缓冲区当前的状态SIZE_OF_BUFFER;cout i g_bufferi; if (i=in) std:- 生产; if (i=out) std:- 消费/从缓冲区中取出一个产品void Take()Taking a product +ConsumeID ConsumeID = g_bufferout; out = (out+1)%SIZE_OF_BUFFER;/消耗一个产品void Consume()Consuming a pro

12、duct ConsumeID /生产者算法DWORD WINAPI Producer(LPVOID lpPara) while(g_continue) WaitForSingleObject(g_hEmptySemaphore,INFINITE); WaitForSingleObject(g_hMutex,INFINITE); Produce(); Append(); Sleep(1500); ReleaseMutex(g_hMutex); ReleaseSemaphore(g_hFullSemaphore,1,NULL); return 0;/消费者算法DWORD WINAPI Consum

13、er(LPVOID lpPara) WaitForSingleObject(g_hFullSemaphore,INFINITE); Take(); Consume(); ReleaseSemaphore(g_hEmptySemaphore,1,NULL);(3)程序源代码清单#include iostreamconst unsigned short SIZE_OF_BUFFER = 10; /缓冲区长度unsigned short ProductID = 0; /生产的产品号unsigned short ConsumeID = 0; /将被消耗的产品号unsigned short in = 0

14、; /产品进缓冲区时的缓冲区下标unsigned short out = 0; /产品出缓冲区时的缓冲区下标int g_bufferSIZE_OF_BUFFER; /缓冲区是个循环队列bool g_continue = true; /控制程序结束HANDLE g_hMutex; /用于线程间的互斥HANDLE g_hFullSemaphore; /当缓冲区满时迫使生产者等待HANDLE g_hEmptySemaphore; /当缓冲区空时迫使消费者等待DWORD WINAPI Producer(LPVOID); /生产者算法DWORD WINAPI Consumer(LPVOID); /消费者

15、算法int main() /互斥信号量g_hFullSemaphore = CreateSemaphore(NULL,0,SIZE_OF_BUFFER-1,NULL);/同步信号量,缓冲区满 g_hEmptySemaphore = CreateSemaphore(NULL,SIZE_OF_BUFFER-1,SIZE_OF_BUFFER-1,NULL);/同步信号量,缓冲区空 /调整数值、当生产者个数多于消费者个数时,生产速度快,生产者经常等待消费者;反之,消费者经常等待 const unsigned short PRODUCERS_COUNT = 5; /生产者的个数 const unsign

16、ed short CONSUMERS_COUNT = 3; /消费者的个数 /总的线程数 const unsigned short THREADS_COUNT = PRODUCERS_COUNT+CONSUMERS_COUNT; HANDLE hThreadsPRODUCERS_COUNT; /各线程的操作 DWORD producerIDCONSUMERS_COUNT; /生产者线程的标识符 DWORD consumerIDTHREADS_COUNT; /消费者线程的标识符 /终止程序 if(getchar() g_continue = false;/按回车后终止程序运行(4)程序运行截图三

17、、自我批评与总结任务名称:生产者消费者问题的模拟实现主要功能:在同一个进程地址空间内执行的两个线程,生产者线程生产物品,然后将物品放置在一个空缓冲区中供消费者线程消费,而消费者线程从缓冲区中获得物品,然后释放缓冲区。当生产者线程生产物品时,如果没有空缓冲区可用,那么生产者线程必须等待消费者线程释放出一个空缓冲区,当消费者线程消费物品时,如果没有满的缓冲区,那么消费者线程将被阻塞,直到新的物品被生产出来。遇到的问题:(1)生产者、消费者的状态分类 生产者、消费者具体分为几个状态,生产者不仅要生产产品,还要 把产品放入缓冲区,这可以分为一个状态,也可以分为两个状态,与同学商量后,决定分为两个状态,

18、两个状态可以更好的监视生产者的运行,是程序更为明了,思路就会变得简洁直观,程序的修改更加轻松,同理,消费者的状态也分为取产品和消费产品。(2)生产者、消费者同步互斥的实现要解决这个问题,就必须深入了解同步互斥的概念,同步是指只有冲池中至少有一个缓冲区已存入消息后,消费者才能从中提取信息,否则消费者必须等待。只有缓冲池中至少有一个缓冲区是空时,生产者才能把消息放入缓冲区,否则生产者必须等待。互斥是指只要缓冲区未满,生产者就可以生产产品并将产品送入缓冲区,同时禁止消费者取产品。反之亦然。阅读课本,上网搜索之后,决定设置两个资源号量,一个互斥信号量,通过线程实现。心得体会:这次生产者和消费者问题的课程设计,不但加深了我对操作系统中多线程机制的理解和认识,更让我认识到知识的掌握,仅靠学习理论知识是远远不够的,要与实际动手操作相结合才能更好的理解和分析问题。同时,我还明白了,闭门造车是不行的,与其他人多沟通,多了解,不仅会开阔自己的视野,增长知识,还会带来新的思想,新的方向,很多奇思妙想都是思维碰撞的结果。最重要的是,如果想要解决一个问题,就必须深入了解这个问题,只有把这个问题彻底明白了,才能从根本上解决这个问题。

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

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