欢迎来到天天文库
浏览记录
ID:58665537
大小:68.50 KB
页数:5页
时间:2020-10-15
《哲学家就餐问题实验报告.doc》由会员上传分享,免费在线阅读,更多相关内容在教育资源-天天文库。
1、南昌大学实验报告学生姓名:倪焕学号:专业班级:软件工程141班实验类型:■验证□综合□设计□创新实验日期:2016.5.24实验成绩:一、实验项目名称哲学家就餐问题二、实验目的利用PV操作解决哲学家就餐问题三、软硬件环境软件:VisualStudio2010硬件:PC机一台四、实验内容结果//哲学家就餐问题的解法#include#include#include#include#includeusingnamespacestd;//命名空间std内定义
2、的所有标识符都有效constunsignedintPHILOSOPHER_NUM=5;//哲学家数目constcharTHINKING=1;/*标记当前哲学家的状态,1表示等待,2表示得到饥饿,3表示正在吃饭*/constcharHUNGRY=2;constcharDINING=3;HANDLEhPhilosopher[5];//定义数组存放哲学家/*HANDLE(句柄)是windows操作系统中的一个概念。指的是一个核心对象在某一个进程中的唯一索引*/HANDLEsemaphore[PHILOSOPHER_NUM];//semaphore用来表示筷
3、子是否可用HANDLEmutex;//Mutex用来控制安全输出DWORDWINAPIphilosopherProc(LPVOIDlpParameter)//返回DWORD(32位数据)的API函数philosopherProc{intmyid;//哲学家idcharidStr[128];charstateStr[128];charmystate;intret;unsignedintleftFork;//左筷子unsignedintrightFork;//右筷子myid=int(lpParameter);itoa(myid,idStr,10);Wai
4、tForSingleObject(mutex,INFINITE);cerr<<"philosopher"<5、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,"DINI6、NG");}else{ReleaseSemaphore(semaphore[leftFork],1,NULL);//如果右筷子不可用,就把左筷子放下}}break;caseDINING://吃完后把两支筷子都放下ReleaseSemaphore(semaphore[leftFork],1,NULL);ReleaseSemaphore(semaphore[rightFork],1,NULL);mystate=THINKING;//改变自己的状态strcpy(stateStr,"THINKING");break;}//输出状态WaitForSingleO7、bject(mutex,INFINITE);cerr<<"philosopher"<8、d(NULL,0,philosopherProc,LPVOID(i),CREATE_SUSPENDED,0)
5、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,"DINI
6、NG");}else{ReleaseSemaphore(semaphore[leftFork],1,NULL);//如果右筷子不可用,就把左筷子放下}}break;caseDINING://吃完后把两支筷子都放下ReleaseSemaphore(semaphore[leftFork],1,NULL);ReleaseSemaphore(semaphore[rightFork],1,NULL);mystate=THINKING;//改变自己的状态strcpy(stateStr,"THINKING");break;}//输出状态WaitForSingleO
7、bject(mutex,INFINITE);cerr<<"philosopher"<8、d(NULL,0,philosopherProc,LPVOID(i),CREATE_SUSPENDED,0)
8、d(NULL,0,philosopherProc,LPVOID(i),CREATE_SUSPENDED,0)
此文档下载收益归作者所有