2024年4月2日发(作者:)

1、实验目的:

(1)、掌握基本的同步互斥算法,理解哲学家就餐模型。

(2)、了解windows 2000/XP中多线程的并发执行机制,线程间的同步和互斥。

(3)、学习使用windows 2000/XP中基本的同步对象,掌握相应的API。

2、实验要求

有五个哲学家共用一张放有五把椅子的餐桌,每人坐在一把椅子上,桌子

上有五个碗和五只筷子,每人两边各放一只筷子。哲学家们是交替思考和进

餐,饥饿时便试图取其左右最靠近他的筷子。条件:(1)、只有拿到两只筷子

时,哲学家才能吃饭。(2)、如果筷子已被别人拿走,则必须等别人吃完之后才

能拿到筷子。(3)、任意一个哲学家在自己未拿到两只筷子吃饭前,不会放下手

中拿到的筷子。

3、实验环境

硬件:CPU :AMD QL64 内存:2GB 显卡:ATI 4570 硬盘:日立250G

软件:Windows 2000/XP。开发工具:VC++6.0

4、实验内容

1)实现原理

1、利用记录型信号量解决哲学家进餐问题;

2、临界区互斥编程原理。

2)程序结构(流程图)

开始

定义信号量tools[5]

定义哲学家类对象P1-P5

哲学家的状态发生改变;

();();

ge();();()

输出当前状态

停止程序

结束

图1.主程序模块流程图

开始

哲学家处于的

状态status==1

是 放下左右手

工具

否 哲学家处于思考状态

Status==2

否 哲学家处于等待

Status==0

状态为思考

Status==2

是状态改为等待status==0

是 左右手筷子均空闲

是 拿起左右手筷子

状态改为就餐status==1

结束

图2.状态改变模块流程图

图3.返回哲学家状态流程图

图4返回餐具状态模块流程图

3)数据结构

(1)、定义一个哲学家类,包含两个私有对象和四个公有对象。

(2)、定义函数:

Number对象:哲学家的编号;

Status对象:保存当前该哲学家的状态,0表示等待,1表示吃饭,2表示思

考;

Philosopher(int num)方法:哲学家类构造函数,参数num表示哲学家编

号;find() const方法:返回该哲学家编号;

getinfo() const方法:返回哲学家当前状态;

Change()方法:根据题目要求改变哲学家的状态(等待->进餐->思考)

另外,程序中包含一个公有对象,bool类型数组tools[6],用来保存6把餐

具当前状态:true表示该餐具当前空闲,false表示该餐具当前正被使用。

程序中还包含两个公有函数:print和toolstatus。Print用来返回一个哲

学家的状态,toolstatus用来返回一个餐具的状态。