ImageVerifierCode 换一换
格式:DOCX , 页数:8 ,大小:42.66KB ,
资源ID:4300061      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bdocx.com/down/4300061.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(课程设计哲学家就餐问题报告+代码C++.docx)为本站会员(b****6)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

课程设计哲学家就餐问题报告+代码C++.docx

1、课程设计哲学家就餐问题报告+代码C+课程设计哲学家就餐问题(报告+代码)C+1( 设计题目与要求2 1.1设计目的 1.2设计要求 2( 总体设计思想与相关知识2 2.1总体设计思想 2.2问题描述 2.3解决方案 3( 数据结构、流程图2 3.1数据结构 3.2流程图 4( 源代码.3 5( 运行结果.6 6( 结果分析.7 7( 总结及心得体会.7 8( 参考资料.8 1( 设计题目与要求 1.1设计目的 掌握进程同步问题的解决思路及方法,熟练使用Windows操作系统提供的信号量机制解决各种进程同步问题。 1.2设计要求 设有五个哲学家,共用一张放有五把椅子的餐桌,每人坐在一把椅子上,桌

2、子上有五个碗和五只筷子,每人两边各放一只筷子。哲学家们是交替思考和进餐,饥饿时便试图取其左右最靠近他的筷子。条件: (1) 只有拿到两只筷子时,哲学家才能吃饭。 (2) 如果筷子已被别人拿走,则必须等别人吃完之后才能拿到筷子。 (3) 任意一个哲学家在自己未拿到两只筷子吃饭前,不会放下手中拿到的筷子。 2(总体设计思想与相关知识 2.1总体设计思想 哲学家的生活就是思考和吃饭,即思考,饿了就餐,再思考,循环往复。要求是:每一个哲学家只有在拿到位于他左右的筷子后,才能够就餐;哲学家只能先拿左边的筷子,再去拿右边的筷子,而不能同时去抓他两边的筷子,也不能从其他哲学家手中抢夺筷子;哲学家每次就餐后必

3、须放下他手中的两把筷子后恢复思考,不能强抓住餐具不放。 设计一个程序,能够显示当前各哲学家的状态和桌上餐具的使用情况,并能无死锁的推算出下一状态各哲学家的状态和桌上餐具的使用情况。即设计一个能安排哲学家正常生活的程序。 2.2问题描述 可能出现死锁问题,因为当五个哲学家都饥饿时,都拿着一支筷子,这样就可能五个哲学家都用不上餐。 2.3解决方案 2.3.1 最多允许4个哲学家同时坐在桌子周围。 2.3.2 给所有哲学家编号,奇数号的哲学家必须首先拿左边的筷子,偶数号的哲学家则反之。 2.3.3 为了避免死锁,把哲学家分为三种状态,思考,饥饿,进食,仅当一个哲学家左右两边的筷子都可用时,才允许他拿

4、筷子,并且一次拿到两只筷子,否则不拿。 3(数据结构及流程图 3.1数据结构 philosopherProc +myid:int +mystate:int +philosopherProc(LPVOIDlpParameter) +ResumeThread(hPhilosopheri):int +strcpy(stateStr, ):int 2 程序中定义一个哲学家类,包含两个私有对象和四个公有对象。 myid对象:报讯哲学家的编号。 mystate对象:用于保存当前该哲学家的状态, philosopherProc( LPVOID lpParameter)方法:哲学家类构造函数, PHILOSO

5、PHER_NUM表示哲学家编号 ResumeThread(hPhilosopheri)方法:返回该哲学家编号 strcpy(stateStr, )方法:返回哲学家当前状态 根据题目要求改变哲学家的状态(饥饿-进餐-思考-饥饿) 3.2流程图 开始 mystate=THINKIN;(初始状态为THINKING) While,先检查查看下一个哲学家 左筷子是否可用, 检查右筷子放下左筷子 是否可用 改变哲学家的状态为DINING 放下两支筷子,改变哲学家的状态为THINGKING 结束 4( 源代码 /哲学家就餐问题的解法 #include #include 3 #include #include

6、 #include #include using namespace std; /命名空间std内定义的所有标识符都有效 const unsigned int PHILOSOPHER_NUM=5; /哲学家数目 const char THINKING=1; /*标记当前哲学家的状态,1表示等待,2表示得到饥饿,3表示正在吃饭*/ const char HUNGRY=2; const char DINING=3; HANDLE hPhilosopher5; /定义数组存放哲学家 /*HANDLE(句柄)是windows操作系统中的一个概念。指的是一个核心对象在某一个进程中的唯一索引*/ HAND

7、LE semaphorePHILOSOPHER_NUM; / semaphore 用来表示筷子是否可用 HANDLE mutex; / Mutex用来控制安全输出 DWORD WINAPI philosopherProc( LPVOID lpParameter) /返回 DWORD(32位数API 函数philosopherProc 据)的 int myid; char idStr128; char stateStr128; char mystate; int ret; unsigned int leftFork; /左筷子 unsigned int rightFork; /右筷子 myid

8、= int(lpParameter); itoa(myid, idStr, 10); WaitForSingleObject(mutex, INFINITE); cout philosopher myid begin. endl; ReleaseMutex(mutex); mystate = THINKING; /初始状态为THINKING leftFork = (myid) % PHILOSOPHER_NUM; rightFork = (myid + 1) % PHILOSOPHER_NUM; 4 while (true) switch(mystate) case THINKING: mys

9、tate = HUNGRY; / 改变状态 strcpy(stateStr, HUNGRY); break; case HUNGRY: strcpy(stateStr, HUNGRY); ret = WaitForSingleObject(semaphoreleftFork, 0); / 先检查左筷子是否可用 if (ret = WAIT_OBJECT_0) ret = WaitForSingleObject(semaphorerightFork, 0); /左筷子可用就拿起,再检查右筷子是否可用 if (ret = WAIT_OBJECT_0) mystate = DINING; / 右筷子

10、可用,就改变自己的状态 strcpy(stateStr, DINING); else ReleaseSemaphore(semaphoreleftFork, 1, NULL); / 如果右筷子不可用,就把左筷子放下 break; case DINING: / 吃完后把两支筷子都放下 ReleaseSemaphore(semaphoreleftFork, 1, NULL); ReleaseSemaphore(semaphorerightFork, 1, NULL); mystate = THINKING; / 改变自己的状态 strcpy(stateStr, THINKING); break;

11、/ 输出状态 WaitForSingleObject(mutex, INFINITE); cout philosopher myid is : stateStr endl; 5 ReleaseMutex(mutex); / sleep a random time : between 1 - 5 s int sleepTime; sleepTime = 1 + (int)(5.0*rand()/(RAND_MAX+1.0); Sleep(sleepTime*10); int main() int i; srand(time(0); mutex = CreateMutex(NULL, false,

12、 NULL); for (i=0; iPHILOSOPHER_NUM; i+) semaphorei = CreateSemaphore(NULL, 1, 1, NULL); hPhilosopheri=CreateThread(NULL,0,philosopherProc,LPVOID(i), CREATE_SUSPENDED,0); for (i=0; iPHILOSOPHER_NUM; i+) ResumeThread(hPhilosopheri); Sleep(2000); return 0; 5( 运行结果 6 6( 结果分析 对哲学家进行编号,将他们的初始状态全部设定为THINGK

13、ING,接着先从0开始改变他们的状态为HUNGRY,继续运行后4号和2号哲学家先DINING,3号和1号哲学家为HUNGRY,当4号哲学家吃完后,0号哲学家就开始DINING。 7( 总结及心得体会 课程设计是培养学生综合运用所学知识,发现,提出,分析和解决实际问题,锻炼实践能力的重要环节,是对学生实际工作能力的具体训练和考察过程.随着科学技术发展的日新日异,当今计算机应用在是生活中可以说得是无处不在。因此作为二十一世纪的大学来说掌握计算机开发技术十分重要的。 此次课程设计学到很多很多的的东西,同时不仅可以巩固了以前所学过的知识,而且学到了很多在书本上所没有学到过的知识。通过这次课程设计使我懂得了理论与实际7 相结合是很重要的,只有理论知识是远远不够的,只有把所学的理论知识与实践相结合起来,从理论中得出结论,才能真正为社会服务,从而提高自己的实际动手能力和独立思考的能力。在设计的过程中遇到问题,可以说得是困难重重,这毕竟第一次做的,难免会遇到过各种各样的问题,同时在设计的过程中发现了自己的不足之处,对以前所学过的知识理解得不够深刻,掌握得不够牢固 8( 参考资料 1数据结构.清华大学出版社.2c+高级语言程序设计.中国电力出版社 8

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1