课程设计哲学家就餐问题报告+代码C++.docx

上传人:b****6 文档编号:4300061 上传时间:2022-11-29 格式:DOCX 页数:8 大小:42.66KB
下载 相关 举报
课程设计哲学家就餐问题报告+代码C++.docx_第1页
第1页 / 共8页
课程设计哲学家就餐问题报告+代码C++.docx_第2页
第2页 / 共8页
课程设计哲学家就餐问题报告+代码C++.docx_第3页
第3页 / 共8页
课程设计哲学家就餐问题报告+代码C++.docx_第4页
第4页 / 共8页
课程设计哲学家就餐问题报告+代码C++.docx_第5页
第5页 / 共8页
点击查看更多>>
下载资源
资源描述

课程设计哲学家就餐问题报告+代码C++.docx

《课程设计哲学家就餐问题报告+代码C++.docx》由会员分享,可在线阅读,更多相关《课程设计哲学家就餐问题报告+代码C++.docx(8页珍藏版)》请在冰豆网上搜索。

课程设计哲学家就餐问题报告+代码C++.docx

课程设计哲学家就餐问题报告+代码C++

课程设计哲学家就餐问题(报告+代码)C++

1(设计题目与要求…………………………………………………2

1.1设计目的

1.2设计要求

2(总体设计思想与相关知识………………………………………2

2.1总体设计思想

2.2问题描述

2.3解决方案

3(数据结构、流程图………………………………………………2

3.1数据结构

3.2流程图

4(源代码…………………………………………………………….35(运行结果………………………………………………………….66(结果分析………………………………………………………….77(总结及心得体会………………………………………………….78(参考资料………………………………………………………….8

1(设计题目与要求

1.1设计目的

掌握进程同步问题的解决思路及方法,熟练使用Windows操作系统提供的信号量机制解决各种进程同步问题。

1.2设计要求

设有五个哲学家,共用一张放有五把椅子的餐桌,每人坐在一把椅子上,桌子上有五个碗和五只筷子,每人两边各放一只筷子。

哲学家们是交替思考和进餐,饥饿时便试图取其左右最靠近他的筷子。

条件:

(1)只有拿到两只筷子时,哲学家才能吃饭。

(2)如果筷子已被别人拿走,则必须等别人吃完之后才能拿到筷子。

(3)任意一个哲学家在自己未拿到两只筷子吃饭前,不会放下手中拿到的筷子。

2(总体设计思想与相关知识

2.1总体设计思想

哲学家的生活就是思考和吃饭,即思考,饿了就餐,再思考,循环往复。

要求是:

每一个哲学家只有在拿到位于他左右的筷子后,才能够就餐;哲学家只能先拿左边的筷子,再去拿右边的筷子,而不能同时去抓他两边的筷子,也不能从其他哲学家手中抢夺筷子;哲学家每次就餐后必须放下他手中的两把筷子后恢复思考,不能强抓住餐具不放。

设计一个程序,能够显示当前各哲学家的状态和桌上餐具的使用情况,并能无死锁的推算出下一状态各哲学家的状态和桌上餐具的使用情况。

即设计一个能安排哲学家正常生活的程序。

2.2问题描述

可能出现死锁问题,因为当五个哲学家都饥饿时,都拿着一支筷子,这样就可能五个哲学家都用不上餐。

2.3解决方案

2.3.1最多允许4个哲学家同时坐在桌子周围。

2.3.2给所有哲学家编号,奇数号的哲学家必须首先拿左边的筷子,偶数号的哲学家则反之。

2.3.3为了避免死锁,把哲学家分为三种状态,思考,饥饿,进食,仅当一个哲学家左右两边的筷子都可用时,才允许他拿筷子,并且一次拿到两只筷子,否则不拿。

3(数据结构及流程图

3.1数据结构

philosopherProc

+myid:

int

+mystate:

int

+philosopherProc(LPVOIDlpParameter)

+ResumeThread(hPhilosopher[i]):

int

+strcpy(stateStr,""):

int

2

程序中定义一个哲学家类,包含两个私有对象和四个公有对象。

myid对象:

报讯哲学家的编号。

mystate对象:

用于保存当前该哲学家的状态,philosopherProc(LPVOIDlpParameter)方法:

哲学家类构造函数,PHILOSOPHER_NUM

表示哲学家编号

ResumeThread(hPhilosopher[i])方法:

返回该哲学家编号strcpy(stateStr,"")方法:

返回哲学家当前状态根据题目要求改变哲学家的状态(饥饿->进餐->思考->饥饿…………)

3.2流程图

开始

mystate=THINKIN;(初始状态为

THINKING)

While,先检查查看下一个哲学家左筷子是否可

用,

检查右筷子放下左筷子是否可用

改变哲学家的状态

为DINING

放下两支筷子,改变

哲学家的状态为

THINGKING

结束

4(源代码

//哲学家就餐问题的解法

#include

#include

3

#include

#include

#include

#include

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"<

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:

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");

}

else

{

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);

cout<<"philosopher"<

"<

5

ReleaseMutex(mutex);

//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

{

semaphore[i]=CreateSemaphore(NULL,1,1,NULL);

hPhilosopher[i]=CreateThread(NULL,0,philosopherProc,LPVOID(i),

CREATE_SUSPENDED,0);

}

for(i=0;i

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

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 初中教育 > 理化生

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1