课程设计哲学家就餐问题报告+代码C++Word格式文档下载.docx
- 文档编号:17220811
- 上传时间:2022-11-29
- 格式:DOCX
- 页数:8
- 大小:42.66KB
课程设计哲学家就餐问题报告+代码C++Word格式文档下载.docx
《课程设计哲学家就餐问题报告+代码C++Word格式文档下载.docx》由会员分享,可在线阅读,更多相关《课程设计哲学家就餐问题报告+代码C++Word格式文档下载.docx(8页珍藏版)》请在冰豆网上搜索。
(1)只有拿到两只筷子时,哲学家才能吃饭。
(2)如果筷子已被别人拿走,则必须等别人吃完之后才能拿到筷子。
(3)任意一个哲学家在自己未拿到两只筷子吃饭前,不会放下手中拿到的筷子。
2(总体设计思想与相关知识
哲学家的生活就是思考和吃饭,即思考,饿了就餐,再思考,循环往复。
要求是:
每一个哲学家只有在拿到位于他左右的筷子后,才能够就餐;
哲学家只能先拿左边的筷子,再去拿右边的筷子,而不能同时去抓他两边的筷子,也不能从其他哲学家手中抢夺筷子;
哲学家每次就餐后必须放下他手中的两把筷子后恢复思考,不能强抓住餐具不放。
设计一个程序,能够显示当前各哲学家的状态和桌上餐具的使用情况,并能无死锁的推算出下一状态各哲学家的状态和桌上餐具的使用情况。
即设计一个能安排哲学家正常生活的程序。
可能出现死锁问题,因为当五个哲学家都饥饿时,都拿着一支筷子,这样就可能五个哲学家都用不上餐。
2.3.1最多允许4个哲学家同时坐在桌子周围。
2.3.2给所有哲学家编号,奇数号的哲学家必须首先拿左边的筷子,偶数号的哲学家则反之。
2.3.3为了避免死锁,把哲学家分为三种状态,思考,饥饿,进食,仅当一个哲学家左右两边的筷子都可用时,才允许他拿筷子,并且一次拿到两只筷子,否则不拿。
3(数据结构及流程图
philosopherProc
+myid:
int
+mystate:
+philosopherProc(LPVOIDlpParameter)
+ResumeThread(hPhilosopher[i]):
+strcpy(stateStr,"
"
):
2
程序中定义一个哲学家类,包含两个私有对象和四个公有对象。
myid对象:
报讯哲学家的编号。
mystate对象:
用于保存当前该哲学家的状态,philosopherProc(LPVOIDlpParameter)方法:
哲学家类构造函数,PHILOSOPHER_NUM
表示哲学家编号
ResumeThread(hPhilosopher[i])方法:
返回该哲学家编号strcpy(stateStr,"
)方法:
返回哲学家当前状态根据题目要求改变哲学家的状态(饥饿->
进餐->
思考->
饥饿…………)
开始
mystate=THINKIN;
(初始状态为
THINKING)
While,先检查查看下一个哲学家左筷子是否可
用,
检查右筷子放下左筷子是否可用
改变哲学家的状态
为DINING
放下两支筷子,改变
哲学家的状态为
THINGKING
结束
4(源代码
//哲学家就餐问题的解法
#include<
windows.h>
process.h>
3
time.h>
stdlib.h>
stdio.h>
iostream>
usingnamespacestd;
//命名空间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;
charidStr[128];
charstateStr[128];
charmystate;
intret;
unsignedintleftFork;
//左筷子
unsignedintrightFork;
//右筷子
myid=int(lpParameter);
itoa(myid,idStr,10);
WaitForSingleObject(mutex,INFINITE);
cout<
<
"
philosopher"
<
myid<
begin......"
endl;
ReleaseMutex(mutex);
mystate=THINKING;
//初始状态为THINKING
leftFork=(myid)%PHILOSOPHER_NUM;
rightFork=(myid+1)%PHILOSOPHER_NUM;
4
while(true)
switch(mystate)
caseTHINKING:
mystate=HUNGRY;
//改变状态
strcpy(stateStr,"
HUNGRY"
);
break;
caseHUNGRY:
ret=WaitForSingleObject(semaphore[leftFork],0);
//先检查左筷子是否可用
if(ret==WAIT_OBJECT_0)
ret=WaitForSingleObject(semaphore[rightFork],0);
//左筷子可用就拿起,再检查右筷子是否可用
mystate=DINING;
//右筷子可用,就改变自己的状态
DINING"
}
else
ReleaseSemaphore(semaphore[leftFork],1,NULL);
//如果右筷子不可用,就把左筷子放下
caseDINING:
//吃完后把两支筷子都放下
ReleaseSemaphore(semaphore[rightFork],1,NULL);
//改变自己的状态
THINKING"
//输出状态
is:
stateStr<
5
//sleeparandomtime:
between1-5s
intsleepTime;
sleepTime=1+(int)(5.0*rand()/(RAND_MAX+1.0));
Sleep(sleepTime*10);
intmain()
inti;
srand(time(0));
mutex=CreateMutex(NULL,false,NULL);
for(i=0;
i<
PHILOSOPHER_NUM;
i++)
semaphore[i]=CreateSemaphore(NULL,1,1,NULL);
hPhilosopher[i]=CreateThread(NULL,0,philosopherProc,LPVOID(i),
CREATE_SUSPENDED,0);
ResumeThread(hPhilosopher[i]);
Sleep(2000);
return0;
5(运行结果
6
6(结果分析
对哲学家进行编号,将他们的初始状态全部设定为THINGKING,接着先从0开始改变他们的状态为HUNGRY,继续运行后4号和2号哲学家先DINING,3号和1号哲学家为HUNGRY,当4号哲学家吃完后,0号哲学家就开始DINING。
7(总结及心得体会
课程设计是培养学生综合运用所学知识,发现,提出,分析和解决实际问题,锻炼实践能力的重要环节,是对学生实际工作能力的具体训练和考察过程.随着科学技术发展的日新日异,当今计算机应用在是生活中可以说得是无处不在。
因此作为二十一世纪的大学来说掌握计算机开发技术十分重要的。
此次课程设计学到很多很多的的东西,同时不仅可以巩固了以前所学过的知识,而且学到了很多在书本上所没有学到过的知识。
通过这次课程设计使我懂得了理论与实际
7
相结合是很重要的,只有理论知识是远远不够的,只有把所学的理论知识与实践相结合起来,从理论中得出结论,才能真正为社会服务,从而提高自己的实际动手能力和独立思考的能力。
在设计的过程中遇到问题,可以说得是困难重重,这毕竟第一次做的,难免会遇到过各种各样的问题,同时在设计的过程中发现了自己的不足之处,对以前所学过的知识理解得不够深刻,掌握得不够牢固
8(参考资料
[1]数据结构.清华大学出版社.
[2]c++高级语言程序设计.中国电力出版社
8
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 课程设计 哲学家 就餐 问题 报告 代码 C+