哲学家进餐问题.doc

哲学家进餐问题.doc

ID:51800118

大小:72.00 KB

页数:9页

时间:2020-03-15

哲学家进餐问题.doc_第1页
哲学家进餐问题.doc_第2页
哲学家进餐问题.doc_第3页
哲学家进餐问题.doc_第4页
哲学家进餐问题.doc_第5页
资源描述:

《哲学家进餐问题.doc》由会员上传分享,免费在线阅读,更多相关内容在行业资料-天天文库

1、一、需求分析有一个故事是这样的:假设有五位哲学家围坐在一张圆形餐桌旁,做以下两件事情之一:吃饭,或者思考。吃东西的时候,他们就停止思考,思考的时候也停止吃东西。餐桌中间有一大碗意大利面,每两个哲学家之间有一只餐叉。因为用一只餐叉很难吃到意大利面,所以假设哲学家必须用两只餐叉吃东西。他们只能使用自己左右手边的那两只餐叉。上边的故事里有五个哲学家(不过我们写的程序可以有N个哲学家),这些哲学家们只思考或吃饭,他们思考的时候不需要任何共享资源,但是吃饭的时候就必须使用餐具,而餐桌上的餐具是有限的,故事里,餐具是叉子,吃饭的时候要用两把叉子把面

2、条从碗里捞出来。很显然把叉子换成筷子会更合理,因为一个哲学家需要两根筷子才能吃饭。1AA62AA53A4A1、2、3、4、5、6为哲学家A为一根筷子4现在引入问题:有六个哲学家很穷,只买得起六根筷子。他们坐成一圈,两个人的中间放一根筷子。哲学家吃饭的时候必须同时得到左手边和右手边的筷子。如果他身边的任何一位正在使用筷子,那他只有等着。如下图:9以上就为我们要处理的哲学家就餐问题,接下来将编写程序模拟解决这个问题。二、系统概要设计2.1设计一个程序,能够显示当前各哲学家的状态和桌上餐具的使用情况,并能无死锁的推算出一状态各哲学家的状态和桌

3、上餐具的使用情况。即设计一个能安排哲学家正常生活的程序。为哲学家设计3种状态,即“等待”“进餐”“思考”。每个哲学家重复进行“等待”->“进餐”->“思考”的行动循环。其中:“等待”->“进餐”:只有一个哲学家处于等待进餐状态,且左右手两边的餐具都处于“空闲”状态时,可以发生这种状态改变。此状态改变发生后,哲学家拿起左右手两边的餐具。“进餐”->“思考”:此状态改变发生后,哲学家放下左右手上的餐具。餐具状态由“使用中”转变为“空闲”。“思考”->“等待”:哲学家思考结束后,无条件转入等待状态。由上所述,程序中应设置6个元素的信号量数组用

4、来保持哲学家之间的同步。2.2系统平台、语言及工具(1)操作系统:Windows(2)程序设计语言:C++(3)工具:VC++6.02.3不论是硬件临界资源,还是软件临界资源,多个进程必须互斥地对它进行访问。每个进程中访问临界资源的那段代码称为临界区(CriticalSection)。每个进程中访问临界资源的那段程序称为临界区(CriticalSection)(临界资源是一次仅允许一个进程使用的共享资源)。每次只准许一个进程进入临界区,进入后不允许其他进程进入。不论是硬件临界资源,还是软件临界资源,多个进程必须互斥地对它进行访问。9三、

5、系统详细设计定义信号量开始定义哲学家类对象哲学家们的状态发生改变输出当前状态图停止程序?结束否是9程序中定义一个哲学家类,包含两个私有对象和四个公有对象。Number对象:哲学家的编号。Status对象:用于保存当前该哲学家的状态,0表示正在等待(即处于饥饿状态)1表示得到筷子正在吃饭,2表示正在思考Philosopher(intnum)方法:哲学家类构造函数,参数num表示哲学家编号find()const方法:返回该哲学家编号getinfo()const方法:返回哲学家当前状态Change()方法:根据题目要求改变哲学家的状态(等待-

6、>进餐->思考->等待…………)另外,程序中包含一个公有对象,bool类型数组tools[6],用来保存6根筷子当前状态:true表示该筷子当前空闲,false表示该筷子当前正被使用。程序中还包含两个公有函数:print和toolstatus。Print用来返回一个哲学家的状态,toolstatus用来返回一根筷子的状态。四、系统的主要源代码#include#include#include#include#includeusingnamespa

7、cestd;//控制活动线程数目的信号量(保护线程共享资源)booltools[6];//全局变量,用餐工具9CRITICAL_SECTIONcs;//信号量,在线程中使用,临界区classPhilosopher{private:intnumber;intstatus;/*标记当前哲学家的状态,0表示正在等待(即处于饥饿状态),1表示得到两支筷子正在吃饭,2表示正在思考*/public:Philosopher(intnum=0):status(2),number(num){}intfind()const{returnnumber;}in

8、tgetinfo()const{returnstatus;}voidChange();//状态改变函数};voidPhilosopher::Change(){EnterCriticalSection(&cs

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

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

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