操作系统-生产者和消费者.docxVIP

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  4. 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  5. 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  6. 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  7. 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多

实验题目

生产者和消费者实验

实验目的

通过对“生产者-消费者”问题编程实现,了解线程创建、同步信号量、互斥信号量、临界区的创建和使用,初步了解并发程序设计方法。

实验内容

“生产者-消费者问题模型是指一组生产者进程和一组消费者进程通过一个缓冲区进行合作。先有生产者生产产品,再有消费者消费生产者生产的产品。本实验以“生产者-消费者”模型为依据,提供了一个多线程“生产者-消费者”实例,要求读者分析该实例,调试并得出最终结果。分析该结果,得相应结论。

设计思路和算法

主要数据结构及其说明

InitializeCriticalSection()函数

函数功能:初始化一个临界资源对象

CreateSemaphore()函数

函数功能:创建一个同步信号灯Semaphore

CreateMutex()函数

函数功能:创建一个互斥信号灯Mutex

CreateThread()函数

函数功能:创建一线程

WaitForSingleObject()函数

函数功能:有信号量时执行,否则一直等待

测试数据设计及测试结果分析

输入文本

缓冲区数

线程序号线程标识延时时间消费顺序

由test1到达的时间知:

线程执行的顺序是

6

3

7(消费产品1,无1,等待)

2

1

7(有产品1,消费,消费产品3,有3,消费,消费产品2,有2,消费)

4(消费产品5,无5,等待)

5

4(有产品5,消费,消费产品6,有6消费)

程序能正常执行至结束

由test3到达时间及缓冲区数量知

6,

3,

8(消费产品1,无1,等待),

2,

7,,

5(无缓冲区不生产,找消费者消费),

4(消费产品5,无5,等待)

1(无缓冲区不生产,找消费者消费)

程序形成死锁,可调整执行顺序或者增加缓冲区消除死锁

程序运行结果

test1运行结果:

test3运行结果:

实验体会

在有限的缓冲区里,生产者生产的产品要有消费者来消费,使缓冲区一直保持在可用状态,若是安排不合理,则会陷入死循环。一般上,解决的办法一是调度算法合理,即线程到达的顺序,二是安排足够大的缓冲区。

生产者线程和消费者线程共用一个缓冲池时,生产者生产产品占用缓冲区,消费者消费产品释放缓冲区,要使变量之间的数传递。系统对这两个函数执行的过程使用的是并发执行,即在执行过程中跳过这段程序转去执行另一段并发程序,回过头来再执行起初尚未执行完的那段程序。

这次实验让我们看到了并发程序执行的过程。

附源程序文件

#includewindows.h

#includefstream.h

#includestdio.h

#includestring

#includeconio.h

//定义一些常量

#defineMAX_BUFFER_NUM20//本程序允许的最大临界区间

#defineINTE_PER_SEC1000//秒到毫秒的乘法因子

#defineMAX_THREAD_NUM64//本程序允许的生产者和消费者线程的总数

//定义一个结构,记录在测试文件中指定的每一个线程的参数

structThreadInfo

{

intserial;//线程序列号

charentity;

doubledelay;//线程延迟

intthread_request[MAX_THREAD_NUM];//线程请求队列

intn_request;//请求个数

};

//全局变量

CRITICAL_SECTIONPC_Critical[MAX_BUFFER_NUM];//临界区对象的声明,用于管理缓冲区的互斥访问

intBuffer_Critical[MAX_BUFFER_NUM];//缓冲区声明,用于存放产品

HANDLEh_Thread[MAX_THREAD_NUM];//用于存储每个线程句柄的数组

ThreadInfoThread_Info[MAX_THREAD_NUM];//线程信息数组

HANDLEempty_semaphore;//一个信号量

HANDLEh_mutex;//一个互斥量

DWORDn_Thread=0;//实际的线程数目

DWORDn_Buffer_or_Critical;//实际的缓冲区或者临界区数目

HANDLEh_Semaphore[MAX_THREAD_NUM];//生产者允许消费者开始消费的信号量

//生产消费及辅助函数的声明

voidProduce(void*p);

voidConsume(void*p);

boolIfInOtherRequest(int);

intFind

文档评论(0)

177****7891 + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档