1、哲学家就餐问题实验报告 哲学家就餐问题实验报告 姓名: 何绍金 班级:自动化1202 学号:201203870408 指导教师: 张健 2014年11月22日 一实验题目 经典的同步问题哲学家就餐问题设计。二实验内容 1.实验要求 有五个哲学家围坐在一圆桌旁,桌中央有一盘通心粉,每人面前有一只空盘子,每两人之间放一只筷子每个哲学家的行为是思考,感到饥饿,然后吃通心粉.为了吃通心粉,每个哲学家必须拿到两只筷子,并且每个人只能直接从自己的左边或右边去取筷子。 2.程序流程图图1.主程序模块流程图图2.状态改变模块流程图图3.返回哲学家状态流程图图4返回餐具状态模块流程图3.测试结果图5 测试结果1
2、图6 测试结果2图7 测试结果34.结果分析和小结(1)程序分为四大模块,一步步解决了哲学家状态及状态改变的问题,筷子的“闲”、“用”问题;实现了哲学家等待、吃饭、思考三个过程的转换循环,并且避免了死锁问题;让临界资源得到了充分的利用。(2)这次实验让我学会分模块解决问题,怎样运用互斥锁对临界资源进行管理;此外自己在编程上及一些函数的认识仍存在较大的问题,以后应该多多实践,提高自己的反应速度,加强逻辑思维能力。三程序源代码#include #include #include #include #include using namespace std;bool tools5; /全局变量,用餐工
3、具CRITICAL_SECTION cs; /信号量, 在线程中使用,临界区class Philosopherprivate: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();/v
4、oid Philosopher:dead_lock()EnterCriticalSection (&cs) ; /进入临界区string s;if(status=1)toolsnumber%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)toolsnumber%5=false;tools(number-1)%5=false;status=1;LeaveCriticalSectio
5、n (&cs) ;/ coutChange();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; /判断是否继续/ con = n;for(int i=0;i5;i+)toolsi=true; /筷子都未使用,初始化Philosopher P1(1),P2(
6、2),P3(3),P4(4),P5(5);InitializeCriticalSection (&cs) ; /初始化初始化临界区cout-状态说明示意图:-endl;cout 哲学家1号的状态 endl;cout 筷子0的状态 筷子1的状态endl;cout哲学家5号的状态 哲学家2号的状态endl;cout 筷子4的状态 筷子2的状态endl;cout 哲学家4号的状态 哲学家3号的状态endl;cout 筷子3的状态endl;/cout 哲学家3号的状态 endl;cout筷子的状态,用表示使用中,闲表示空闲中。endl;cout-endl;/cout哲学家们开始生活:endl;/cou
7、t当前状态:;coutcon;while(con=y)P1.Change(); P2.Change(); P3.Change(); P4.Change(); P5.Change();cout当前状态为:endl;cout P1.find()print(&P1) endl;cout toolstatus(tools0) toolstatus(tools1)endl;cout P5.find()print(&P5) P2.find()print(&P2)endl;cout toolstatus(tools4) toolstatus(tools2)endl;cout P4.find()print(&
8、P4) P3.find()print(&P3)endl;cout toolstatus(tools3)endl;cout-endl;coutcon;Sleep(20);while(con=n)P1.dead_lock();P2.dead_lock(); P3.dead_lock(); P4.dead_lock(); P5.dead_lock();cout死锁情况endl;cout P1.find()print(&P1) endl;cout toolstatus(tools0) toolstatus(tools1)endl;cout P5.find()print(&P5) P2.find()print(&P2)endl;cout toolstatus(tools4) toolstatus(tools2)endl;cout P4.find()print(&P4) P3.find()print(&P3)endl;cout toolstatus(tools3)endl;cout-endl;coutcon;Sleep(20);DeleteCriticalSection (&cs) ; /退出资源区return 0;
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1