《哲学家就餐问题实验报告(共5页).doc》由会员分享,可在线阅读,更多相关《哲学家就餐问题实验报告(共5页).doc(5页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、精选优质文档-倾情为你奉上 南昌大学实验报告学生姓名: 倪焕 学 号: 专业班级: 软件工程141班 实验类型: 验证 综合 设计 创新 实验日期: 2016.5.24 实验成绩: 一、 实验项目名称 哲学家就餐问题二、实验目的 利用PV操作解决哲学家就餐问题三、 软硬件环境 软件:Visual Studio2010 硬件:PC机一台四、 实验内容结果/哲学家就餐问题的解法#include #include #include #include #include using namespace std; /命名空间std内定义的所有标识符都有效const unsigned int PHILOSO
2、PHER_NUM=5; /哲学家数目const char THINKING=1; /*标记当前哲学家的状态,1表示等待,2表示得到饥饿,3表示正在吃饭*/const char HUNGRY=2;const char DINING=3;HANDLE hPhilosopher5; /定义数组存放哲学家 /*HANDLE(句柄)是windows操作系统中的一个概念。指的是一个核心对象在某一个进程中的唯一索引*/HANDLE semaphorePHILOSOPHER_NUM; / semaphore 用来表示筷子是否可用HANDLE mutex; / Mutex用来控制安全输出DWORD WINAPI
3、 philosopherProc( LPVOID lpParameter) /返回 DWORD(32位数据)的 API 函数philosopherProc int myid; /哲学家id char idStr128; char stateStr128; char mystate; int ret; unsigned int leftFork; /左筷子 unsigned int rightFork; /右筷子 myid = int(lpParameter); itoa(myid, idStr, 10); WaitForSingleObject(mutex, INFINITE); cerr p
4、hilosopher myid begin. endl; ReleaseMutex(mutex); mystate = THINKING; /初始状态为THINKING leftFork = (myid) % PHILOSOPHER_NUM; rightFork = (myid + 1) % PHILOSOPHER_NUM; while (true) switch(mystate) case THINKING: mystate = HUNGRY; / 改变状态 strcpy(stateStr, HUNGRY); break; case HUNGRY: strcpy(stateStr, HUNG
5、RY); ret = WaitForSingleObject(semaphoreleftFork, 0); / 先检查左筷子是否可用 if (ret = WAIT_OBJECT_0) ret = WaitForSingleObject(semaphorerightFork, 0); /左筷子可用就拿起,再检查右筷子是否可用 if (ret = WAIT_OBJECT_0) mystate = DINING; / 右筷子可用,就改变自己的状态 strcpy(stateStr, DINING);elseReleaseSemaphore(semaphoreleftFork, 1, NULL); /
6、如果右筷子不可用,就把左筷子放下 break; case DINING: / 吃完后把两支筷子都放下 ReleaseSemaphore(semaphoreleftFork, 1, NULL); ReleaseSemaphore(semaphorerightFork, 1, NULL); mystate = THINKING; / 改变自己的状态 strcpy(stateStr, THINKING); break; / 输出状态 WaitForSingleObject(mutex, INFINITE); cerr philosopher myid is : stateStr endl; Rele
7、aseMutex(mutex); Sleep(5000);int main() int i,run; run = 1; mutex = CreateMutex(NULL, false, NULL); for (i=0; iPHILOSOPHER_NUM; i+) semaphorei = CreateSemaphore(NULL, 1, 1, NULL); /创建一个新的信号量 hPhilosopheri=CreateThread(NULL,0,philosopherProc,LPVOID(i), CREATE_SUSPENDED,0); /创建一个新线程 ResumeThread(hPhilosopheri); /线程恢复函数 Sleep(15); while(run) Sleep(5000); cerr*endl; return 0;五、实验体会 通过本次实验,首先是对哲学家就餐问题有了更深的了解,而通过PV操作,很好的解决了哲学家就餐问题,这使得我对PV操作更加熟悉,同时帮助我理解了原先不太懂的地方,希望强加练习。专心-专注-专业