




下载本文档
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、目录1设计题目与要求 11.1 实验目的与设计要求 11.2 初始条件 12. 总体设计思想及相关知识 22.1 总体设计思想22.2 临界区互斥编程原理22.3 开发环境与工具33. 数据结构与模块说明 33.1 数据结构 33.2 程序各模块流程图 53.2.1 主程序模块53.2.2 状态改变模块63.2.3 返回哲学家状态模块73.2.4 返回餐具状态模块84. 源程序代码95. 测试及结果146. 课设总结 16参考文献 171 .设计题目与要求1.1 实验目的与设计要求实验目的:通过实现哲学家进餐问题的同步深入了解和掌握进程同步和互斥 的原理。设计要求:哲学家有N个,也定全体到齐后
2、开始讨论:在讨论的间隙哲学家进 餐,每人进餐时都需使用刀、叉各一把,所有哲学家刀和叉都拿到后才能进餐。 哲学家的人数、餐桌上的布置自行设定,实现刀和叉的互斥使用算法的程序实现。1.2 初始条件(1)操作系统:windows(2)程序设计语言:C+(3)设定圆桌上有六个哲学家,三对刀叉,如下图摆放:哲学家编号3号更田1号刀2号义图2号刀图1-1哲学家进餐问题设定图2 总体设计思想及相关知识2.1 总体设计思想哲学家的生活就是思考和吃饭, 即思考, 饿了就餐, 再思考, 循环往复。 要:每一个哲学家只有在拿到位于他左右的刀叉后, 才能够就餐; 哲学家只能先拿一把刀或叉, 再去拿另一把刀或叉, 而不
3、能同时去抓他旁边的两把餐具, 也不能从其他哲学家手中抢夺餐具; 哲学家每次就餐后必须放下他手中的两把餐具后恢复思考,不能强抓住餐具不放。设计一个程序, 能够显示当前各哲学家的状态和桌上餐具的使用情况, 并能无死锁的推算出下一状态各哲学家的状态和桌上餐具的使用情况。 即设计一个能安排哲学家正常生活的程序。为哲学家设计3 种状态,即“等待” “进餐” “思考” 。每个哲学家重复进行“等待” -> “进餐” -> “思考”的行动循环。其中:“等待” -> “进餐” :只有一个哲学家处于等待进餐状态,且左右手两边的餐具都处于“空闲”状态时,可以发生这种状态改变。此状态改变发生后,哲学
4、家拿起左右手两边的餐具。“进餐”-> “思考”:此状态改变发生后,哲学家放下左右手上的餐具。餐具状态由“使用中”转变为“空闲” 。“思考”-> “等待”:哲学家思考结束后,无条件转入等待状态。由上所述, 程序中应设置6 个元素的信号量数组, tools6 , 用来保持哲学家之间的同步。2.2 临界区互斥编程原理不论是硬件临界资源, 还是软件临界资源, 多个进程必须互斥地对它进行访Critical Section每个进程中访问临界资源的那段程序称为临界区(Critical Section )(临 界资源是一次仅允许一个进程使用的共享资源)。每次只准许一个进程进入临界 区,进入后不允许
5、其他进程进入。不论是硬件临界资源,还是软件临界资源,多 个进程必须互斥地对它进行访问。本程序主要使用了 EnterCriticalSection (&cs) 和 LeaveCriticalSection (&cs)两个函数实现临界区互斥。EnterCriticalSection (&cs)用来进入临界区,LeaveCriticalSection (&cs) 用来离开临界区。2.3 开发环境与工具系统平台:WINDO/境实现语言:C+开发工具:VC+6.03数据结构与模块说明3.1数据结构Philosopher-number:int-status:int+Phil
6、osopher(in num:int) +find() const:int +getinfo() const:int +Change():void 程序中定义一个哲学家类,包含两个私有对象和四个公有对象。NumberX寸象:报讯哲学家的编号。Status 对象: 用于保存当前该哲学家的状态, 0 表示正在等待 (即处于饥饿状态)1 表示得到餐具正在吃饭, 2 表示正在思考Philosopher(int num) 方法:哲学家类构造函数,参数num表示哲学家编号find() const 方法:返回该哲学家编号 getinfo() const 方法:返回哲学家当前状态Change() 方法:根据题
7、目要求改变哲学家的状态(等待-进餐 -思考 -等待)另外,程序中包含一个公有对象, bool 类型数组 tools6 ,用来保存6 把餐当前状态:true 表示该餐具当前空闲, false 表示该餐具当前正被使用。程序中还包含两个公有函数: print 和 toolstatus 。 Print 用来返回一个哲学家的状态,toolstatus用来返回一个餐具的状态。3.2程序各模块流程图3.2.1主程序模块是结束图3-2主程序模块流程图3.2.2 状态改变模块图3-3状态改变模块Change()流程图单起左右于餐具1t uuli iLliilibe 1356 136 .tools (number
8、-1)*S=fale .W改费状态为进饕;St 3tUS=l iXL3.2.3返回哲学家状态模块取得状态数;int i=pA'>fl®tinfoO;Etr= "等待是返回st r 5图3-4返回哲学家状态模块print()流程图3.2.4 返回餐具状态模块图3-5返回餐具X态模块toolstatus(bool a) 流程图4. 源程序代码/ 实验目的:通过实现哲学家进餐问题的同步深入了解和掌握进程同步和互斥的原理。/ 设计要求:哲学家有N 个,也定全体到达后开始讨论:在讨论的间隙哲学家进餐,/ 每人进餐时都需使用刀、 叉各一把, 所有哲学家刀和叉都拿到后才能进
9、餐。 哲学家的人数、/ 餐桌上的布置自行设定,实现刀和叉的互斥使用算法的程序实现。#include <windows.h>#include <time.h>#include <string>#include <iostream>#include <assert.h>using namespace std;bool tools6;/ 全局变量,用餐工具CRITICAL_SECTION cs; / 信号量 , 在线程中使用,临界区class Philosopherprivate:int number;int status; /* 标记当前
10、哲学家的状态,0 表示正在等待( 即处于饥饿状态 ),1 表示得到两支筷子正在吃饭 ,2 表示正在思考*/public:Philosopher(int num=0): status(2), number(num) int find() const return number; int getinfo() const return status; void Change() ; / 状态改变函数;void Philosopher:Change()EnterCriticalSection (&cs) ; / 进入临界区if(status=1) / 正在进餐toolsnumber%6=tru
11、e; / 放下左手工具tools(number-1)%6=true; / 放下右手工具status=2;/ 改变状态为思考/ 思考中/ 改变状态为等待/ 等待中else if(status=2)status=0;else if(status=0)左右手两边工具均if(toolsnumber%6&&tools(number-1)%6) /为空闲状态toolsnumber%6=false; / 拿起左手工具 tools(number-1)%6=false; / 拿起右手工具 status=1;LeaveCriticalSection (&cs) ; string print
12、(Philosopher *pA) /pA->Change();int i=pA->getinfo();string str;if(i=0)str=" 等待 "else if(i=1)str=" 就餐 "else str=" 思考 "return str;string toolstatus(bool a)string state;if(a=true)state=" 闲 "if(a=false)state=" 用"return state;int main()(char con = &
13、#39;y' /判断是否继续for(int i=0;i<6;i+)toolsi=true; /3组刀叉都未使用,初始化Philosopher P1(1),P2(2),P3(3),P4(4),P5(5),P6(6);InitializeCriticalSection (&cs) ; /初始化初始化临界区cout<<" 状 态 说 明 示 意 图 :"<<endl; cout<<""<<"哲学家 0 号的状态"<<""<<en
14、dl;cout<<"哲学家5号的状态"<<""<<"叉3的状态"<<""<<"刀1的状态"<<""<<"哲学家1号的状态"<<endl;cout<<" "<<" 刀 3 的状态"<<""<<" 叉 1 的状态"<<endl;
15、cout<<"哲学家4号的状态"<<""<<"叉2的状态"<<""<<"刀2的状态"<<""<<"哲学家2号的状态"<<endl;cout<<""<<"哲学家 3 号的状态"<<""<<endl;cout<<”餐具的状态,“用”表示使用中,“闲
16、”表示空闲中。"<<endl;cout<<""<<endl;cout<<"哲学家们开始生活:"<<endl;cout<<endl;cout<<endl;while(con='y')(P1.Change();P2.Change();P3.Change();P4.Change();P5.Change();P6.Change();cout<<"当前状态为:"<<endl;cout<<"&
17、quot;<<P1.find()<<print(&P1)<<""<<endl;cout<<P6.find()<<print(&P6)<<""<<toolstatus(tools0)<<""<<toolstatus(tools1)<<""<<P2.find()<<print(&P2)<<endl;cout<<&quo
18、t; "<<toolstatus(tools5)<<""<<toolstatus(tools2)<<endl;cout<<P5.find()<<print(&P5)<<""<<toolstatus(tools4)<<""<<toolstatus(tools3)<<""<<P3.find()<<print(&P3)<<endl;cout<<""<<P4.find()<<print(&P4)<<""<<endl;
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 海北藏族自治州中石油2025秋招面试半结构化模拟题及答案炼化装置操作岗
- 丽水市中储粮2025秋招笔试粮食政策与企业文化50题速记
- 长春市中储粮2025秋招财务资产岗高频笔试题库含答案
- 榆林市中储粮2025秋招基建工程岗高频笔试题库含答案
- 宁夏地区中储粮2025秋招面试专业追问题库基建工程岗
- 中国移动东莞市2025秋招半结构化面试模拟30问及答案
- 中国广电许昌市2025秋招笔试行测题库及答案网络优化与维护类
- 张掖市中石油2025秋招笔试模拟题含答案油田工程技术岗
- 国家能源宿迁市2025秋招交通运输类面试追问及参考回答
- 国家能源铜陵市2025秋招面试专业追问及参考交通运输岗位
- 货代销售技巧
- 广东省深圳实验中学2023-2024学年高二上学期期中数学模拟试题
- DB11∕T 583-2022 扣件式和碗扣式钢管脚手架安全选用技术规程
- 食材配送服务质量保证方案
- 《孕前和孕期保健》课件
- 肾病科糖尿病肾病(DKD)与终末期肾病血液透析(ESRD-HD)单病种质量控制统计表
- 空间设计教学大纲 室内设计教学大纲(五篇)
- 促单技巧及话术大全
- 车辆司法鉴定申请书
- 塑料原料名称中英文对照表
- 第十四杂环化合物
评论
0/150
提交评论