您好,欢迎访问三七文档
当前位置:首页 > 临时分类 > 哲学家就餐问题实验报告
1南昌大学实验报告学生姓名:倪焕学号:8000114018专业班级:软件工程141班实验类型:■验证□综合□设计□创新实验日期:2016.5.24实验成绩:一、实验项目名称哲学家就餐问题二、实验目的利用PV操作解决哲学家就餐问题三、软硬件环境软件:VisualStudio2010硬件:PC机一台四、实验内容结果//哲学家就餐问题的解法#includewindows.h#includeprocess.h#includestdlib.h#includestdio.h#includeiostreamusingnamespacestd;//命名空间std内定义的所有标识符都有效constunsignedintPHILOSOPHER_NUM=5;//哲学家数目constcharTHINKING=1;/*标记当前哲学家的状态,1表示等待,2表示得到饥饿,3表示正在吃饭*/constcharHUNGRY=2;constcharDINING=3;HANDLEhPhilosopher[5];//定义数组存放哲学家/*HANDLE(句柄)是windows操作系统中的一个概念。指的是一个核心对象在某一个进程中的唯一索引*/HANDLEsemaphore[PHILOSOPHER_NUM];//semaphore用来表示筷子是否可用HANDLEmutex;//Mutex用来控制安全输出DWORDWINAPIphilosopherProc(LPVOIDlpParameter)//返回DWORD(32位数据)的API函数philosopherProc{intmyid;//哲学家idcharidStr[128];2charstateStr[128];charmystate;intret;unsignedintleftFork;//左筷子unsignedintrightFork;//右筷子myid=int(lpParameter);itoa(myid,idStr,10);WaitForSingleObject(mutex,INFINITE);cerrphilosophermyidbegin......endl;ReleaseMutex(mutex);mystate=THINKING;//初始状态为THINKINGleftFork=(myid)%PHILOSOPHER_NUM;rightFork=(myid+1)%PHILOSOPHER_NUM;while(true){switch(mystate){caseTHINKING:mystate=HUNGRY;//改变状态strcpy(stateStr,HUNGRY);break;caseHUNGRY:strcpy(stateStr,HUNGRY);ret=WaitForSingleObject(semaphore[leftFork],0);//先检查左筷子是否可用if(ret==WAIT_OBJECT_0){ret=WaitForSingleObject(semaphore[rightFork],0);//左筷子可用就拿起,再检查右筷子是否可用if(ret==WAIT_OBJECT_0){mystate=DINING;//右筷子可用,就改变自己的状态strcpy(stateStr,DINING);}3else{ReleaseSemaphore(semaphore[leftFork],1,NULL);//如果右筷子不可用,就把左筷子放下}}break;caseDINING://吃完后把两支筷子都放下ReleaseSemaphore(semaphore[leftFork],1,NULL);ReleaseSemaphore(semaphore[rightFork],1,NULL);mystate=THINKING;//改变自己的状态strcpy(stateStr,THINKING);break;}//输出状态WaitForSingleObject(mutex,INFINITE);cerrphilosophermyidis:stateStrendl;ReleaseMutex(mutex);Sleep(5000);}}intmain(){inti,run;run=1;mutex=CreateMutex(NULL,false,NULL);for(i=0;iPHILOSOPHER_NUM;i++){semaphore[i]=CreateSemaphore(NULL,1,1,NULL);//创建一个新的信号量hPhilosopher[i]=CreateThread(NULL,0,philosopherProc,LPVOID(i),CREATE_SUSPENDED,0);//创建一个新线程ResumeThread(hPhilosopher[i]);//线程恢复函数Sleep(15);}while(run){Sleep(5000);cerr**************************************endl;}4return0;}5五、实验体会通过本次实验,首先是对哲学家就餐问题有了更深的了解,而通过PV操作,很好的解决了哲学家就餐问题,这使得我对PV操作更加熟悉,同时帮助我理解了原先不太懂的地方,希望强加练习。
本文标题:哲学家就餐问题实验报告
链接地址:https://www.777doc.com/doc-5808196 .html