哲学家就餐问题实验报告.doc

  1. 1、本文档共10页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 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)

a13355589 + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档