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