您好,欢迎访问三七文档
当前位置:首页 > 商业/管理/HR > 销售管理 > 操作系统(生产者与消费者问题)
实验二进程的互斥与同步(生产者与消费者问题)一、实验目的:利用Windows提供的API函数,编写程序,解决生产者与消费者问题,实现进程的互斥与同步。二、实验内容与步骤:本实验要求设计并实现一个进程,该进程拥有一个生产者线程和一个消费者线程,它们使用N个不同的缓冲区(N为一个确定的数值,例如N=32)。生产者生产产品,将产品放入缓冲区,如果缓冲区满了,就不能生产产品了,等到缓冲区有空了再生产,消费者线程消费产品,从缓冲区取出产品消费,如果缓冲区是空的,就不能消费,线程挂起,生产者与消费者不能同时对缓冲区操作。需要使用如下信号量:一个互斥信号量,用以阻止生产者线程和消费者线程同时操作缓冲区列表;一个信号量,当生产者线程生产出一个物品时可以用它向消费者线程发出信号;一个信号量,消费者线程释放出一个空缓冲区时可以用它向生产者线程发出信号;编写一段程序,模拟生产者和消费者线程,实现进程的互斥与同步。利用VC++6.0实现上述程序设计和调试操作,对于生产者和消费者线程操作的成功与提供一定的提示框。通过阅读和分析实验程序,熟悉进程的互斥与同步的概念。三、实验代码:#includewindows.h#includeiostreamusingnamespacestd;constunsignedshortN=5;//定义缓冲区的大小HANDLEm_S_Empty;//生产者SemaphoreHANDLEm_S_Full;//消费者SemaphoreHANDLEm_M_Mutex;//互斥intbuffer[N];//定义共享缓冲区unsignedshortProductID=0;//产品号unsignedshortConsumeID=0;//将被消耗的产品号unsignedshortin=0;//产品进缓冲区时的缓冲区下标unsignedshortout=0;//产品出缓冲区时的缓冲区下标boolflag=true;//控制程序结束DWORDWINAPIProducer(LPVOID);//生产者线程DWORDWINAPIConsumer(LPVOID);//消费者线程intmain(){m_S_Empty=CreateSemaphore(NULL,N,N,NULL);//初始计数为Nm_S_Full=CreateSemaphore(NULL,0,N,NULL);//初始计数为0m_M_Mutex=CreateMutex(NULL,FALSE,NULL);CreateThread(NULL,0,Producer,NULL,0,NULL);//创建生产者线程CreateThread(NULL,0,Consumer,NULL,0,NULL);//创建消费者线程while(flag){if(getchar()){//按回车后终止程序运行flag=false;}}return0;}voidProduce(){cout产品生产中++ProductID...;cout生产成功endl;}voidConsume(){cout产品消费中ConsumeID...;cout消费成功endl;}voidAppend(){cout放入一个产品...;buffer[in]=ProductID;in=(in+1)%N;cout放入成功endl;//输出缓冲区当前的状态for(inti=0;iN;i++){std::couti:buffer[i];if(i==in)cout--生产;if(i==out)cout--消费;coutendl;}}voidTake(){cout取出一个产品...;ConsumeID=buffer[out];out=(out+1)%N;cout取出成功endl;//输出缓冲区当前的状态for(inti=0;iN;i++){couti:buffer[i];if(i==in)cout--生产;if(i==out)cout--消费;coutendl;}}DWORDWINAPIProducer(LPVOID){while(flag){if(WaitForSingleObject(m_S_Empty,INFINITE)==WAIT_OBJECT_0){if(WaitForSingleObject(m_M_Mutex,INFINITE)==WAIT_OBJECT_0){Produce();//生产一个物品Append();//将所生产的物品放到指定的缓冲区中Sleep(1500);ReleaseMutex(m_M_Mutex);ReleaseSemaphore(m_S_Full,1,NULL);}}}return0;}DWORDWINAPIConsumer(LPVOID){while(flag){if(WaitForSingleObject(m_S_Full,INFINITE)==WAIT_OBJECT_0){if(WaitForSingleObject(m_M_Mutex,INFINITE)==WAIT_OBJECT_0){Take();//取出一个物品Consume();//消费一个产品Sleep(1500);ReleaseMutex(m_M_Mutex);ReleaseSemaphore(m_S_Empty,1,NULL);}}}return0;}四、实验运行结果:
本文标题:操作系统(生产者与消费者问题)
链接地址:https://www.777doc.com/doc-5122251 .html