2024年3月11日发(作者:)
哲学家进餐问题
一、需求分析
有一个故事是这样的:假设有五位哲学家围坐在一张圆形餐桌旁,做以下两
件事情之一:吃饭,或者思考。吃东西的时候,他们就停止思考,思考的时候也
停止吃东西。餐桌中间有一大碗意大利面,每两个哲学家之间有一只餐叉。因为
用一只餐叉很难吃到意大利面,所以假设哲学家必须用两只餐叉吃东西。他们只
能使用自己左右手边的那两只餐叉。
上边的故事里有五个哲学家(不过我们写的程序可以有N个哲学家),这些哲
学家们只思考或吃饭,他们思考的时候不需要任何共享资源,但是吃饭的时候就
必须使用餐具,而餐桌上的餐具是有限的,故事里,餐具是叉子,吃饭的时候要
用两把叉子把面条从碗里捞出来。很显然把叉子换成筷子会更合理,因为一个哲
学家需要两根筷子才能吃饭。
现在引入问题:有六个哲学家很穷,只买得起六根筷子。他们坐成一圈,两
个人的中间放一根筷子。哲学家吃饭的时候必须同时得到左手边和右手边的筷
子。如果他身边的任何一位正在使用筷子,那他只有等着。如下图:
A
1
A
6
2
3
A
A
5
A
4
A
1、2、3、4、5、6为哲学家 A为一根筷子
1 / 9
哲学家进餐问题
以上就为我们要处理的哲学家就餐问题,接下来将编写程序模拟解决这个问
题。
二、系统概要设计
2.1设计一个程序,能够显示当前各哲学家的状态和桌上餐具的使用情况,
并能无死锁的推算出一状态各哲学家的状态和桌上餐具的使用情况。即设计一个
能安排哲学家正常生活的程序。
为哲学家设计3种状态,即“等待”“进餐”“思考”。每个哲学家重复进行
“等待”->“进餐”->“思考”的行动循环。其中:“等待”->“进餐”:只有一
个哲学家处于等待进餐状态,且左右手两边的餐具都处于“空闲”状态时,可以
发生这种状态改变。此状态改变发生后,哲学家拿起左右手两边的餐具。“进餐”
->“思考”:此状态改变发生后,哲学家放下左右手上的餐具。餐具状态由“使
用中”转变为“空闲”。“思考”->“等待”:哲学家思考结束后,无条件转入等
待状态。由上所述,程序中应设置6个元素的信号量数组用来保持哲学家之间的
同步。
2.2系统平台、语言及工具
(1)操作系统:Windows
(2)程序设计语言:C++
(3)工具:VC++6.0
2.3不论是硬件临界资源,还是软件临界资源,多个进程必须互斥地对它进
行访问。每个进程中访问临界资源的那段代码称为临界区(Critical Section)。每
个进程中访问临界资源的那段程序称为临界区(Critical Section)(临界资源是一
次仅允许一个进程使用的共享资源)。每次只准许一个进程进入临界区, 进入后
不允许其他进程进入。不论是硬件临界资源,还是软件临界资源,多个进程必须
互斥地对它进行访问。
2 / 9
发布评论