哲学家进餐问题文档

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

目录

1.设计题目与要求 (2)

1.1实验目的 (2)

1.2设计要求 (2)

1.3 初始条件 (2)

2 总体设计思想及相关知识 (3)

2.1总体设计思想 (3)

2.2 临界区互斥编程原理 (3)

2.3开发环境与工具 (4)

3数据结构与模块说明 (4)

3.1 数据结构 (4)

3.2.1 主程序模块 (5)

3.2.2 状态改变模块 (5)

3.2.3 返回哲学家状态模块 (6)

3.2.4 返回餐具状态模块 (7)

4. 源程序代码 (8)

5. 测试及结果 (13)

6. 课设总结 (15)

7. 参考文献 (16)

1.设计题目与要求

1.1实验目的

通过实现哲学家进餐问题的互步,深入了解和掌握进程互斥的原理。

1.2设计要求

哲学家有N个,也定全体到达后开始讨论:在讨论的间隙哲学家进餐,每人进餐时都需使用刀、叉各一把,所有哲学家刀和叉都拿到后才能进餐。哲学家的人数、餐桌上的布置自行设定,实现刀和叉的互斥使用算法的程序实现。

1.3 初始条件

(1)操作系统:windows

(2)程序设计语言:C++

(3)设定圆桌上有六个哲学家,三对刀叉,如下图摆放:

图1-1 哲学家进餐问题设定图

2 总体设计思想及相关知识

2.1总体设计思想

哲学家的生活就是思考和吃饭,即思考,饿了就餐,再思考,循环往复。要求是:每一个哲学家只有在拿到位于他左右的刀叉后,才能够就餐;哲学家只能先拿一把刀或叉,再去拿另一把刀或叉,而不能同时去抓他旁边的两把餐具,也不能从其他哲学家手中抢夺餐具;哲学家每次就餐后必须放下他手中的两把餐具后恢复思考,不能强抓住餐具不放。

设计一个程序,能够显示当前各哲学家的状态和桌上餐具的使用情况,并能无死锁的推算出下一状态各哲学家的状态和桌上餐具的使用情况。即设计一个能安排哲学家正常生活的程序。

为哲学家设计3种状态,即“等待”“进餐”“思考”。每个哲学家重复进行“等待”->“进餐”->“思考”的行动循环。其中:

“等待”->“进餐”:只有一个哲学家处于等待进餐状态,且左右手两边的餐具都处于“空闲”状态时,可以发生这种状态改变。此状态改变发生后,哲学家拿起左右手两边的餐具。

“进餐”->“思考”:此状态改变发生后,哲学家放下左右手上的餐具。餐具状态由“使用中”转变为“空闲”。

“思考”->“等待”:哲学家思考结束后,无条件转入等待状态。

由上所述,程序中应设置6个元素的信号量数组,tools[6],用来保持哲学家之间的同步。

2.2 临界区互斥编程原理

不论是硬件临界资源,还是软件临界资源,多个进程必须互斥地对它进行访问。每个进程中访问临界资源的那段代码称为临界区(Critical Section)。

每个进程中访问临界资源的那段程序称为临界区(Critical Section)(临界资源是一次仅允许一个进程使用的共享资源)。每次只准许一个进程进入临界区,

进入后不允许其他进程进入。不论是硬件临界资源,还是软件临界资源,多个进程必须互斥地对它进行访问。

本程序主要使用了EnterCriticalSection (&cs)和LeaveCriticalSection (&cs)两个函数实现临界区互斥。

EnterCriticalSection (&cs)用来进入临界区,LeaveCriticalSection (&cs)用来离开临界区。

2.3开发环境与工具

系统平台:WINDOW环境

实现语言:C++

开发工具:VC++6.0

3数据结构与模块说明

3.1 数据结构

程序中定义一个哲学家类,包含两个私有对象和四个公有对象。

Number对象:报讯哲学家的编号。

Status对象:用于保存当前该哲学家的状态,0表示正在等待(即处于饥饿状态)1表示得到餐具正在吃饭,2表示正在思考

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

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

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

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

待…………)

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

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

程序中还包含两个公有函数:print和toolstatus。Print用来返回一个哲学家的状态,toolstatus 用来返回一个餐具的状态。3.2程序各模块流程图

3.2.1 主程序模块

图3-2 主程序模块流程图

3.2.2 状态改变模块

图3-3 状态改变模块Change()流程图3.2.3 返回哲学家状态模块

图3-4 返回哲学家状态模块print()流程图3.2.4 返回餐具状态模块

图3-5 返回餐具状态模块toolstatus(bool a)流程图

4. 源程序代码

目的:通过实现哲学家进餐问题的互步,深入了解和掌握进程互斥的原理。

设计要求:哲学家有N个,规定全体到齐后开始讨论,在讨论的间隙哲学家进餐,每人进餐时都需使用刀、叉合一把,所有哲学家刀和叉都拿到后才能进餐。哲学家的人数、餐桌上的布置自行设定,实现刀和叉的互斥使用算法的程序实现。

#include

#include

#include

相关文档
最新文档