操作系统课程设计哲学家进餐问题报告

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

操作系统课程设计哲学家进餐问题报告
课程设计报告(本科/专科)
课程:
操作系统课程设计
学号:
姓名:
班级:
教师:
时间:
2012.12.7 -2013.1.7
计算机科学与技术系
程序中还包含两个公有函数: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号餐具在使用。

退出程序
结果分析:
源程序代码:
#include <windows.h>
#include <time.h>
#include <string>
#include <iostream>
#include <assert.h>
using namespace std;
bool tools[6]; //全局变量,用餐工具
CRITICAL_SECTION cs; //信号量, 在线程中使用,临界区,当一个线程执行了EnterCritialSection之后,cs里面的信息便被修改了,以指明哪一个线程占用了它。

class Philosopher
{
private:
int number;
int status; /*标记当前哲学家的状态,0表示正在等待(即处于饥
饿状态),1表示得到两支筷子正在吃饭,2表示正在思考
*/
public:
Philosopher(int num=0): status(2), number(num) { }
int find() const { return number; }
int getinfo() const { return status; }
void Change() ; //状态改变函数
};
void Philosopher::Change()
{
EnterCriticalSection (&cs) ; //进入临界区
if(status==1) //正在进餐
{
tools[number%6]=true; //放下左手工具
tools[(number-1)%6]=true; //放下右手工具
status=2; //改变状态为思考
}
else if(status==2) //思考中
{
status=0; //改变状态为等待
}
else if(status==0) //等待中
{
if(tools[number%6]&&tools[(number-1)%6]) //左右手两边工具均为空闲状态
{
tools[number%6]=false; //拿起左手工具
tools[(number-1)%6]=false; //拿起右手工具
status=1;
}
}
LeaveCriticalSection (&cs) ;
}
string print(Philosopher *pA)
{
//pA->Change();
int i=pA->getinfo();
string str;
if(i==0)
str="等待";
else if(i==1)
str="就餐";
else str="思考";
return str;
}
string toolstatus(bool a)
{
string state;
if(a==true)
state="闲";
if(a==false)
state="用";
return state;
}
int main()
{
char con = 'y'; //判断是否继续
for(int i=0;i<6;i++)
tools[i]=true; //3组刀叉都未使用,初始化
Philosopher P1(1),P2(2),P3(3),P4(4),P5(5),P6(6);
InitializeCriticalSection (&cs) ; //初始化初始化临界区
cout<<"-----------------------状态说明示意图:-----------------------"<<endl;
cout<<" "<<"哲学家0号的状态"<<" "<<endl;
cout<<"哲学家5号的状态"<<" "<<"叉3的状态"<<" "<<"刀1的状态"<<" "<<"哲学家1号的状态"<<endl;
cout<<" "<<"刀3的状态"<<" "<<"叉1的状态"<<endl;
cout<<"哲学家4号的状态"<<" "<<"叉2的状态"<<" "<<"刀2的状态"<<" "<<"哲学家2号的状态"<<endl;
cout<<" "<<"哲学家3号的状态"<<" "<<endl;
cout<<"餐具的状态,用表示使用中,闲表示空闲中。

"<<endl;
cout<<"--------------------------"<<endl;
cout<<"哲学家们开始生活:"<<endl;
cout<<endl;
cout<<endl;
while(con=='y')
{
P1.Change();
P2.Change();
P3.Change();
P4.Change();
P5.Change();
P6.Change();
cout<<"当前状态为:"<<endl;
cout<<" "<<P1.find()<<print(&P1)<<" "<<endl;
cout<<P6.find()<<print(&P6)<<" "<<toolstatus(tools[0])<<"
"<<toolstatus(tools[1])<<" "<<P2.find()<<print(&P2)<<endl;
cout<<" "<<toolstatus(tools[5])<<"
"<<toolstatus(tools[2])<<endl;
cout<<P5.find()<<print(&P5)<<" "<<toolstatus(tools[4])<<"
"<<toolstatus(tools[3])<<" "<<P3.find()<<print(&P3)<<endl;
cout<<" "<<P4.find()<<print(&P4)<<" "<<endl;
cout<<"--------------------------"<<endl;
cout<<"若要继续下一状态,输入y;输入其他,结束程序:";
cin>>con;
Sleep(20);
}
DeleteCriticalSection (&cs) ; //退出资源区
return 0;
}。

相关文档
最新文档