实验二生产者和消费者.doc

实验二生产者和消费者.doc

ID:52717956

大小:59.50 KB

页数:9页

时间:2020-03-29

实验二生产者和消费者.doc_第1页
实验二生产者和消费者.doc_第2页
实验二生产者和消费者.doc_第3页
实验二生产者和消费者.doc_第4页
实验二生产者和消费者.doc_第5页
资源描述:

《实验二生产者和消费者.doc》由会员上传分享,免费在线阅读,更多相关内容在教育资源-天天文库

1、1.1实验目标掌握操作系统对进程管理的同步和互斥问题,以经典同步问题“生产者和消费者”为例,运用所学C语言知识,编写该问题的模拟运行环境。1.2实验环境教案机房,C语言程序平台。1.3实验内容及步骤1.了解经典同步问题“生产者和消费者”生产者与消费者可以通过一个环形缓冲池联系起来,环形缓冲池由几个大小相等的缓冲块组成,每个缓冲块容纳一个产品。每个生产者可不断地每次往缓冲池中送一个生产产品,而每个消费者则可不断地每次从缓冲池中取出一个产品。指针i和指针j分别指出当前的第一个空缓冲块和第一个满缓冲块。b5E2RGbCAP2.分析和理解

2、<1)既存在合作同步问题,也存在临界区互斥问题合作同步:当缓冲池全满时,表示供过于求,生产者必须等待,同时唤醒消费者;当缓冲池全空时,表示供不应求,消费者应等待,同时唤醒生产者。p1EanqFDPw互斥:缓冲池显然是临界资源,所在生产者与消费都要使用它,而且都要改变它的状态。<2)基于环形缓冲区的生产者与消费者关系形式描述:公用信号量mutex:初值为1,用于实现临界区互斥生产者私用信号量empty:初值为n,指示空缓冲块数目消费者私用信号量full:初值为0,指示满缓冲块数目整型量i和j初值为0,i指示首空缓冲块序号,j指示首满

3、缓冲块序号<3)PV原语varmutex,empty,full:semaphore。i,j:integer。buffer:array[0...n-1]ofitem。i:=j:=1。Procedureproducer。beginwhiletruedobeginproduceaproduct。P(empty>。P(mutex>。buffer(i>:=product。i:=(i+1>modn。V(mutex>。V(full>。end。end。Procedureconsumer。beginP(full>。9/9P(mutex>。goods

4、:=buffer(j>。j:=(j+1>modn。V(mutex>。V(empty>。consumeaproduct。end。end。3.用C语言编程搭建“生产者和消费者”经典进程通信问题的环境。要求程序运行时,按任意键停止,显示当前系统的各个参数的值。提交实验报告,以及相关程序列表。打包成附件上传。DXDiTa9E3d#include#include#include#defineP(S>WaitForSingleObject(S,INFINITE>//定义Windows

5、下的P操作RTCrpUDGiT#defineV(S>ReleaseSemaphore(S,1,NULL>//定义Windows下的V操作5PCzVD7HxA#definerate1000#defineCONSUMER_NUM10/*消费者个数*/#definePRODUCER_NUM10/*生产者个数*/#defineBUFFER_NUM4/*缓冲区个数*/typedefHANDLESemaphore。//信号量的Windows原型char*thing[10]={"物品1","物品2","物品3","物品4","物品5","物品6

6、","物品7","物品8","物品9","物品10"}。structBuffer{intproduct[BUFFER_NUM]。//缓冲区intstart,end。//两个指针}g_buf。Semaphoreg_semBuffer,g_semProduct,g_mutex。jLBHrnAILg9/9//消费者线程DWORDWINAPIConsumer(LPVOIDpara>{inti=*(int*>para。//i表示第i个消费者intptr,j。//待消费的内容的指针Sleep(100>。while(1>{P(g_semProd

7、uct>。//有产品,先锁住缓冲区P(g_mutex>。//记录消费的物品ptr=g_buf.start。//再移动缓冲区指针g_buf.start=(g_buf.start+1>%BUFFER_NUM。V(g_mutex>。//让其他消费者或生产者使用g_bufprintf("消费者%d:消费了buf[%d]里的=%s",i,ptr,thing[g_buf.product[ptr]]>。xHAQX74J0XSleep(rate*rand(>%10+110>。//消费完毕,并释放一个缓冲V(g_semBuffer>。if(j+

8、+>30>break。}getchar(>。return0。}//生产者线程9/9DWORDWINAPIProducer(LPVOIDpara>{inti=*(int*>para-CONSUMER_NUM。intptr。intdata。//产品Sl

当前文档最多预览五页,下载文档查看全文

此文档下载收益归作者所有

当前文档最多预览五页,下载文档查看全文
温馨提示:
1. 部分包含数学公式或PPT动画的文件,查看预览时可能会显示错乱或异常,文件下载后无此问题,请放心下载。
2. 本文档由用户上传,版权归属用户,天天文库负责整理代发布。如果您对本文档版权有争议请及时联系客服。
3. 下载前请仔细阅读文档内容,确认文档内容符合您的需求后进行下载,若出现内容与标题不符可向本站投诉处理。
4. 下载文档时可能由于网络波动等原因无法下载或下载错误,付费完成后未能成功下载的用户请联系客服处理。