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