《操作系统(生产者与消费者问题)(共4页).docx》由会员分享,可在线阅读,更多相关《操作系统(生产者与消费者问题)(共4页).docx(4页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、精选优质文档-倾情为你奉上实验二 进程的互斥与同步(生产者与消费者问题)一、 实验目的:利用Windows提供的API函数,编写程序,解决生产者与消费者问题,实现进程的互斥与同步。二、 实验内容与步骤:本实验要求设计并实现一个进程,该进程拥有一个生产者线程和一个消费者线程,它们使用N个不同的缓冲区(N为一个确定的数值,例如N=32)。生产者生产产品,将产品放入缓冲区,如果缓冲区满了,就不能生产产品了,等到缓冲区有空了再生产,消费者线程消费产品,从缓冲区取出产品消费,如果缓冲区是空的,就不能消费,线程挂起,生产者与消费者不能同时对缓冲区操作。需要使用如下信号量:一个互斥信号量,用以阻止生产者线程
2、和消费者线程同时操作缓冲区列表;一个信号量,当生产者线程生产出一个物品时可以用它向消费者线程发出信号;一个信号量,消费者线程释放出一个空缓冲区时可以用它向生产者线程发出信号;编写一段程序,模拟生产者和消费者线程,实现进程的互斥与同步。利用VC+6.0实现上述程序设计和调试操作,对于生产者和消费者线程操作的成功与提供一定的提示框。通过阅读和分析实验程序,熟悉进程的互斥与同步的概念。三、 实验代码:#include#includeusing namespace std;const unsigned short N=5;/定义缓冲区的大小HANDLE m_S_Empty; / 生产者Semaphor
3、eHANDLE m_S_Full; / 消费者SemaphoreHANDLE m_M_Mutex;/互斥int bufferN; /定义共享缓冲区unsigned short ProductID = 0; /产品号unsigned short ConsumeID = 0; /将被消耗的产品号unsigned short in = 0; /产品进缓冲区时的缓冲区下标unsigned short out = 0; /产品出缓冲区时的缓冲区下标bool flag = true; /控制程序结束DWORD WINAPI Producer(LPVOID); /生产者线程DWORD WINAPI Cons
4、umer(LPVOID); /消费者线程int main() 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(getch
5、ar() /按回车后终止程序运行 flag = false; return 0;void Produce()cout产品生产中+ProductID . ;cout生产成功endl;void Consume()cout产品消费中ConsumeID . ;cout消费成功endl;void Append()cout放入一个产品. ; bufferin = ProductID; in = (in+1)%N; cout放入成功endl; /输出缓冲区当前的状态 for (int i=0;iN;i+) std:couti: bufferi; if(i=in) cout - 生产; if(i=out) c
6、out - 消费; coutendl; void Take()cout取出一个产品. ;ConsumeID = bufferout;out = (out+1)%N;cout取出成功endl; /输出缓冲区当前的状态for (int i=0;iN;i+) couti: bufferi; if(i=in) cout - 生产; if(i=out) cout - 消费; coutendl; DWORD WINAPI Producer(LPVOID)while(flag)if(WaitForSingleObject(m_S_Empty,INFINITE)=WAIT_OBJECT_0)if(WaitFo
7、rSingleObject(m_M_Mutex,INFINITE)=WAIT_OBJECT_0) Produce();/生产一个物品 Append();/将所生产的物品放到指定的缓冲区中 Sleep(1500);ReleaseMutex(m_M_Mutex);ReleaseSemaphore(m_S_Full, 1, NULL); return 0;DWORD WINAPI Consumer(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);return 0;四、 实验运行结果:专心-专注-专业