哲学家就餐问题实验报告

哲学家就餐问题实验报告

ID:9903467

大小:152.50 KB

页数:10页

时间:2018-05-14

哲学家就餐问题实验报告_第1页
哲学家就餐问题实验报告_第2页
哲学家就餐问题实验报告_第3页
哲学家就餐问题实验报告_第4页
哲学家就餐问题实验报告_第5页
资源描述:

《哲学家就餐问题实验报告》由会员上传分享,免费在线阅读,更多相关内容在学术论文-天天文库

1、哲学家就餐问题实验报告姓名:班级:学号:指导教师:20年11月22日一.实验题目经典的同步问题——哲学家就餐问题设计。二.实验内容1.实验要求有五个哲学家围坐在一圆桌旁,桌中央有一盘通心粉,每人面前有一只空盘子,每两人之间放一只筷子每个哲学家的行为是思考,感到饥饿,然后吃通心粉.为了吃通心粉,每个哲学家必须拿到两只筷子,并且每个人只能直接从自己的左边或右边去取筷子。2.程序流程图开始定义信号量tools[5]定义哲学家类对象P1-P5哲学家的状态发生改变;P1.change();P2.change

2、();P3.change();P4.change();P5.change()输出当前状态停止程序结束否图1.主程序模块流程图哲学家处于的状态status==1否哲学家处于思考状态Status==2是状态改为等待status==0否哲学家处于等待Status==0是左右手筷子均空闲是拿起左右手筷子状态改为就餐status==1结束开始是放下左右手工具状态为思考Status==2图2.状态改变模块流程图图3.返回哲学家状态流程图图4返回餐具状态模块流程图3.测试结果图5测试结果1图6测试结果2图7测试

3、结果34.结果分析和小结(1)程序分为四大模块,一步步解决了哲学家状态及状态改变的问题,筷子的“闲”、“用”问题;实现了哲学家等待、吃饭、思考三个过程的转换循环,并且避免了死锁问题;让临界资源得到了充分的利用。(2)这次实验让我学会分模块解决问题,怎样运用互斥锁对临界资源进行管理;此外自己在编程上及一些函数的认识仍存在较大的问题,以后应该多多实践,提高自己的反应速度,加强逻辑思维能力。三.程序源代码#include#include#include

4、>#include#includeusingnamespacestd;booltools[5];//全局变量,用餐工具CRITICAL_SECTIONcs;//信号量,在线程中使用,临界区classPhilosopher{private:intnumber;intstatus;/*标记当前哲学家的状态,0表示正在等待(即处于饥饿状态),1表示得到两支筷子正在吃饭,2表示正在思考*/public:Philosopher(intnum=0):status(2),

5、number(num){}constintfind(){returnnumber;}constintgetinfo(){returnstatus;}voidChange();//状态改变函数voiddead_lock();};/////////voidPhilosopher::dead_lock(){EnterCriticalSection(&cs);//进入临界区strings;if(status==1){tools[number%5]=true;//tools[(number-1)%5]=tr

6、ue;status=2;}elseif(status==2){status=0;//tools[(number-1)%5]=false;//tools[(number-1)%5]=true;}elseif(status==0){tools[number%5]=false;tools[(number-1)%5]=false;status=1;}LeaveCriticalSection(&cs);//cout<<"*********";}/////////voidPhilosopher::Change

7、(){EnterCriticalSection(&cs);//进入临界区if(status==1)//正在进餐{tools[number%5]=true;//放下左手工具tools[(number-1)%5]=true;//放下右手工具status=2;//改变状态为思考}elseif(status==2)//思考中{status=0;//改变状态为等待}elseif(status==0)//等待中{if(tools[number%5]&&tools[(number-1)%5])//左右手两边工具

8、均为空闲状态{tools[number%5]=false;//拿起左手工具tools[(number-1)%5]=false;//拿起右手工具status=1;}}LeaveCriticalSection(&cs);}stringprint(Philosopher*pA){//pA->Change();inti=pA->getinfo();stringstr;if(i==0)str="等待";elseif(i==1)str="就餐";elsestr="思考";returnstr;}

当前文档最多预览五页,下载文档查看全文

此文档下载收益归作者所有

当前文档最多预览五页,下载文档查看全文
温馨提示:
1. 部分包含数学公式或PPT动画的文件,查看预览时可能会显示错乱或异常,文件下载后无此问题,请放心下载。
2. 本文档由用户上传,版权归属用户,天天文库负责整理代发布。如果您对本文档版权有争议请及时联系客服。
3. 下载前请仔细阅读文档内容,确认文档内容符合您的需求后进行下载,若出现内容与标题不符可向本站投诉处理。
4. 下载文档时可能由于网络波动等原因无法下载或下载错误,付费完成后未能成功下载的用户请联系客服处理。