欢迎来到天天文库
浏览记录
ID:28537618
大小:148.63 KB
页数:9页
时间:2018-12-11
《操作系统-生产者和消费者.docx》由会员上传分享,免费在线阅读,更多相关内容在学术论文-天天文库。
1、一、实验题目生产者和消费者实验二、实验目的通过对“生产者-消费者”问题编程实现,了解线程创建、同步信号量、互斥信号量、临界区的创建和使用,初步了解并发程序设计方法。三、实验内容“生产者-消费者问题模型是指一组生产者进程和一组消费者进程通过一个缓冲区进行合作。先有生产者生产产品,再有消费者消费生产者生产的产品。本实验以“生产者-消费者”模型为依据,提供了一个多线程“生产者-消费者”实例,要求读者分析该实例,调试并得出最终结果。分析该结果,得相应结论。四、设计思路和算法一、主要数据结构及其说明Initi
2、alizeCriticalSection()函数函数功能:初始化一个临界资源对象CreateSemaphore()函数函数功能:创建一个同步信号灯SemaphoreCreateMutex()函数函数功能:创建一个互斥信号灯MutexCreateThread()函数函数功能:创建一线程WaitForSingleObject()函数函数功能:有信号量时执行,否则一直等待二、测试数据设计及测试结果分析输入文本缓冲区数线程序号线程标识延时时间消费顺序由test1到达的时间知:线程执行的顺序是637(消费产品
3、1,无1,等待)217(有产品1,消费,消费产品3,有3,消费,消费产品2,有2,消费)4(消费产品5,无5,等待)54(有产品5,消费,消费产品6,有6消费)程序能正常执行至结束由test3到达时间及缓冲区数量知6,3,8(消费产品1,无1,等待),2,7,,5(无缓冲区不生产,找消费者消费),4(消费产品5,无5,等待)1(无缓冲区不生产,找消费者消费)程序形成死锁,可调整执行顺序或者增加缓冲区消除死锁一、程序运行结果test1运行结果:test3运行结果:一、实验体会在有限的缓冲区里,生产者生
4、产的产品要有消费者来消费,使缓冲区一直保持在可用状态,若是安排不合理,则会陷入死循环。一般上,解决的办法一是调度算法合理,即线程到达的顺序,二是安排足够大的缓冲区。生产者线程和消费者线程共用一个缓冲池时,生产者生产产品占用缓冲区,消费者消费产品释放缓冲区,要使变量之间的数传递。系统对这两个函数执行的过程使用的是并发执行,即在执行过程中跳过这段程序转去执行另一段并发程序,回过头来再执行起初尚未执行完的那段程序。这次实验让我们看到了并发程序执行的过程。二、附源程序文件#include5、>#include#include#include#include//定义一些常量#defineMAX_BUFFER_NUM20//本程序允许的最大临界区间#defineINTE_PER_SEC1000//秒到毫秒的乘法因子#defineMAX_THREAD_NUM64//本程序允许的生产者和消费者线程的总数//定义一个结构,记录在测试文件中指定的每一个线程的参数structThreadInfo{intserial;//线程序6、列号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];//用于存7、储每个线程句柄的数组ThreadInfoThread_Info[MAX_THREAD_NUM];//线程信息数组HANDLEempty_semaphore;//一个信号量HANDLEh_mutex;//一个互斥量DWORDn_Thread=0;//实际的线程数目DWORDn_Buffer_or_Critical;//实际的缓冲区或者临界区数目HANDLEh_Semaphore[MAX_THREAD_NUM];//生产者允许消费者开始消费的信号量//生产消费及辅助函数的声明voidProduce(vo8、id*p);voidConsume(void*p);boolIfInOtherRequest(int);intFindProducePosition();intFindBufferPosition(int);intmain(void){//声明所需变量DWORDwait_for_all;ifstreaminFile;//初始化缓冲区for(inti=0;i
5、>#include#include#include#include//定义一些常量#defineMAX_BUFFER_NUM20//本程序允许的最大临界区间#defineINTE_PER_SEC1000//秒到毫秒的乘法因子#defineMAX_THREAD_NUM64//本程序允许的生产者和消费者线程的总数//定义一个结构,记录在测试文件中指定的每一个线程的参数structThreadInfo{intserial;//线程序
6、列号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];//用于存
7、储每个线程句柄的数组ThreadInfoThread_Info[MAX_THREAD_NUM];//线程信息数组HANDLEempty_semaphore;//一个信号量HANDLEh_mutex;//一个互斥量DWORDn_Thread=0;//实际的线程数目DWORDn_Buffer_or_Critical;//实际的缓冲区或者临界区数目HANDLEh_Semaphore[MAX_THREAD_NUM];//生产者允许消费者开始消费的信号量//生产消费及辅助函数的声明voidProduce(vo
8、id*p);voidConsume(void*p);boolIfInOtherRequest(int);intFindProducePosition();intFindBufferPosition(int);intmain(void){//声明所需变量DWORDwait_for_all;ifstreaminFile;//初始化缓冲区for(inti=0;i
此文档下载收益归作者所有