操作系统课程设计哲学家进餐问题报告Word文档下载推荐.docx
- 文档编号:20700683
- 上传时间:2023-01-25
- 格式:DOCX
- 页数:14
- 大小:326.07KB
操作系统课程设计哲学家进餐问题报告Word文档下载推荐.docx
《操作系统课程设计哲学家进餐问题报告Word文档下载推荐.docx》由会员分享,可在线阅读,更多相关《操作系统课程设计哲学家进餐问题报告Word文档下载推荐.docx(14页珍藏版)》请在冰豆网上搜索。
C++
(3)设定圆桌上有六个哲学家,三对刀叉。
2:
详细设计:
(12月18号至1月6号)
(1):
设计一个程序,能够显示当前各哲学家的状态和桌上餐具的使用情况,并能无死锁的推算出下一状态各哲学家的状态和桌上餐具的使用情况。
即设计一个能安排哲学家正常生活的程序。
(2):
为哲学家设计3种状态,即“等待”“进餐”“思考”。
每个哲学家重复进行“等待”->
“进餐”->
“思考”的行动循环。
(3):
确定程序模块。
(4):
编写程序。
(5):
调试修改。
(6):
结果分析。
设计过程、步骤(可加页):
1.分工:
汤正愿:
课题分析,模块设计,主函数的编写;
洪志飞:
课题分析,模块设计,子函数的编写。
2.确定数据结构
Philosopher
-number:
int
-status:
int
+Philosopher(innum:
int)
+find()const:
+getinfo()const:
+Change():
void
图3-1哲学家类的UML图
程序中定义一个哲学家类,包含两个私有对象和四个公有对象。
Number对象:
报讯哲学家的编号。
Status对象:
用于保存当前该哲学家的状态,0表示正在等待(即处于饥饿状态)1表示得到餐具正在吃饭,2表示正在思考
Philosopher(intnum)方法:
哲学家类构造函数,参数num表示哲学家编号
find()const方法:
返回该哲学家编号
getinfo()const方法:
返回哲学家当前状态
Change()方法:
根据题目要求改变哲学家的状态(等待->
进餐->
思考->
等待…………)
另外,程序中包含一个公有对象,bool类型数组tools[6],用来保存6把餐当前状态:
true表示该餐具当前空闲,false表示该餐具当前正被使用。
程序中还包含两个公有函数:
print和toolstatus。
Print用来返回一个哲学家的状态,toolstatus用来返回一个餐具的状态。
3.模块分析。
(1)主程序模块:
(2)状态改变模块:
(3)返回哲学家状态模块:
(4)返回餐具状态模块:
结果与分析(可以加页):
程序运行开始界面
哲学家状态:
1号,3号,5号哲学家进入等待状态,2号,4号哲学家进入就餐状态,6号哲学家进入思考状态,只有4号,5号餐具空闲。
哲学家状态:
1号,3号,6号哲学家进入等待状态,2号,4号哲学家进入思考状态,5号哲学家进入就餐状态,只有3号,4号餐具在使用。
退出程序
结果分析:
状态1:
1号,3号,5号哲学家进入就餐状态,其他哲学家仍然等待,6把用餐工具都在使用。
状态2:
1号,3号,5号哲学家进入思考状态,6号哲学家进入就餐状态,只有4号,5号餐具在使用。
状态3:
状态4:
分析:
程序能够实现哲学家的思考,就餐,等待状态的转换,餐具能够实现互斥。
设计体会与建议:
经过了前后共2周的时间,我完成了这次课程设计。
通过这次课程设计,我学到了许多课本上学不到的知识,注意到了许多课本上没有提到的东西。
而且,通过这次设计,我得到了一个很好的理论联系实际的机会,锻炼了通过理论解决实际问题的能力。
正所谓“实践出真知”,有些代码看上去没什么问题,但是实际运行起来就是不出正确结果。
代码内部可能存在逻辑或语法等方面我们平时不会注意到的小问题,通过这次课程设计,我积累了不少这样小问题的解决方法。
设计中总会遇到这样那样的问题,遇到问题势必要自己分析问题,通过各种渠道解决问题,比如利用互联网。
这次课程设计也加强了我上网查数检索问题的能力。
有些时候,学习到的知识是次要的,重要的是学习知识的方法。
源程序代码:
#include<
windows.h>
time.h>
string>
iostream>
assert.h>
usingnamespacestd;
booltools[6];
//全局变量,用餐工具
CRITICAL_SECTIONcs;
//信号量,在线程中使用,临界区,当一个线程执行了EnterCritialSection之后,cs里面的信息便被修改了,以指明哪一个线程占用了它。
classPhilosopher
{
private:
intnumber;
intstatus;
/*标记当前哲学家的状态,0表示正在等待(即处于饥饿状态),1表示得到两支筷子正在吃饭,2表示正在思考*/
public:
Philosopher(intnum=0):
status
(2),number(num){}
intfind()const{returnnumber;
}
intgetinfo()const{returnstatus;
voidChange();
//状态改变函数
};
voidPhilosopher:
:
Change()
EnterCriticalSection(&
cs);
//进入临界区
if(status==1)//正在进餐
{
tools[number%6]=true;
//放下左手工具
tools[(number-1)%6]=true;
//放下右手工具
status=2;
//改变状态为思考
}
elseif(status==2)//思考中
{
status=0;
//改变状态为等待
}
elseif(status==0)//等待中
if(tools[number%6]&
&
tools[(number-1)%6])//左右手两边工具均为空闲状态
tools[number%6]=false;
//拿起左手工具
tools[(number-1)%6]=false;
//拿起右手工具
status=1;
LeaveCriticalSection(&
}
stringprint(Philosopher*pA)
//pA->
Change();
inti=pA->
getinfo();
stringstr;
if(i==0)
str="
等待"
;
elseif(i==1)
就餐"
elsestr="
思考"
returnstr;
stringtoolstatus(boola)
{
stringstate;
if(a==true)
state="
闲"
if(a==false)
用"
returnstate;
}
intmain()
charcon='
y'
//判断是否继续
for(inti=0;
i<
6;
i++)
tools[i]=true;
//3组刀叉都未使用,初始化
PhilosopherP1
(1),P2
(2),P3(3),P4(4),P5(5),P6(6);
InitializeCriticalSection(&
//初始化初始化临界区
cout<
<
"
-----------------------状态说明示意图:
-----------------------"
endl;
"
哲学家0号的状态"
"
哲学家5号的状态"
"
叉3的状态"
刀1的状态"
哲学家1号的状态"
"
刀3的状态"
"
叉1的状态"
哲学家4号的状态"
叉2的状态"
刀2的状态"
哲学家2号的状态"
哲学家3号的状态"
餐具的状态,用表示使用中,闲表示空闲中。
--------------------------"
哲学家们开始生活:
while(con=='
)
{
P1.Change();
P2.Change();
P3.Change();
P4.Change();
P5.Change();
P6.Change();
当前状态为:
P1.find()<
print(&
P1)<
P6.find()<
P6)<
toolstatus(tools[0])<
toolstatus(tools[1])<
P2.find()<
P2)<
toolstatus(tools[5])<
toolstatus(tools[2])<
P5.find()<
P5)<
toolstatus(tools[4])<
toolstatus(tools[3])<
P3.find()<
P3)<
P4.find()<
P4)<
若要继续下一状态,输入y;
输入其他,结束程序:
cin>
>
con;
Sleep(20);
DeleteCriticalSection(&
//退出资源区
return0;
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 操作系统 课程设计 哲学家 进餐 问题 报告