- 1、本文档共10页,可阅读全部内容。
- 2、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
哲学家就餐问题实验报告
姓名: 何绍金
班级:自动化1202
学号:201203870408
指导教师: 张健
2014年11月22日
一.实验题目
经典的同步问题——哲学家就餐问题设计。
二.实验内容
1.实验要求
有五个哲学家围坐在一圆桌旁,桌中央有一盘通心粉,每人面前有一只空盘子,每两人之间放一只筷子每个哲学家的行为是思考,感到饥饿,然后吃通心粉.为了吃通心粉,每个哲学家必须拿到两只筷子,并且每个人只能直接从自己的左边或右边去取筷子。
2.程序流程图
开始
开始
定义信号量tools[5]
定义哲学家类对象P1-P5
哲学家的状态发生改变;P1.change();P2.change();P3.change();P4.change();P5.change()
输出当前状态
停止程序
结束
否
图1.主程序模块流程图
哲学家处于的状态status==1
哲学家处于的状态status==1
否 哲学家处于思考状态
Status==2
是状态改为等待status==0
否 哲学家处于等待
Status==0
是 左右手筷子均空闲
是 拿起左右手筷子
状态改为就餐status==1
结束
开始
是 放下左右手工具
状态为思考
Status==2
图2.状态改变模块流程图
图3.返回哲学家状态流程图
图4返回餐具状态模块流程图
3.测试结果
图5 测试结果1
图6 测试结果2
图7 测试结果3
结果分析和小结
(1)程序分为四大模块,一步步解决了哲学家状态及状态改变的问题,筷子的“闲”、“用”问题;实现了哲学家等待、吃饭、思考三个过程的转换循环,并且避免了死锁问题;让临界资源得到了充分的利用。
(2)这次实验让我学会分模块解决问题,怎样运用互斥锁对临界资源进行管理;此外自己在编程上及一些函数的认识仍存在较大的问题,以后应该多多实践,提高自己的反应速度,加强逻辑思维能力。
三.程序源代码
#include windows.h
#include time.h
#include string
#include iostream
#include assert.h
using namespace std;
bool tools[5]; //全局变量,用餐工具
CRITICAL_SECTION cs; //信号量, 在线程中使用,临界区
class Philosopher
{
private:
int number;
int status; /*标记当前哲学家的状态,0表示正在等待
(即处于饥饿状态),1表示得到两支筷子正在吃饭,2表示正在思考*/
public:
Philosopher(int num=0): status(2), number(num) { }
const int find()
{
return number;
}
const int getinfo()
{ return status; }
void Change() ; //状态改变函数
void dead_lock();
};
/////////
void Philosopher::dead_lock()
{
EnterCriticalSection (cs) ; //进入临界区
string s;
if(status==1)
{
tools[number%5]=true;
// tools[(number-1)%5]=true;
status=2;
}
else if(status==2)
{
status=0;
//tools[(number-1)%5]=false;
//tools[(number-1)%5]=true;
}
else if(status==0)
{
tools[number%5]=false;
tools[(number-1)%5]=false;
status=1;
}
LeaveCriticalSection (cs) ;
// cout*********;
}
/////////
void Philosopher::Change()
{
EnterCriticalSection (cs) ; //进入临界区
if(status==1) //正在进餐
{
tools[number%5]=true; //放下左手工具
tools[(number-1)%5]=true; //放下右手工具
status=2; //改变状态为思考
}
else if(status==2) //思考中
{
s
文档评论(0)