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用来返回一个餐具的状态。
发布评论