




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、目录1设计题目与要求 21.1 设计目的1.2 设计要求2总体设计思想与相关知识22.1 总体设计思想2.2 问题描述2.3 解决方案3数据结构、流程图 23.1 数据结构3.2 流程图4源代码 .35运行结果 .66结果分析 .77总结及心得体会 .71 设计题目与要求1.1设计目的掌握进程同步问题的解决思路及方法, 熟练使用 Windows操作系统提供的信号量机制解决各种进程同步问题。1.2设计要求设有五个哲学家 , 共用一张放有五把椅子的餐桌 , 每人坐在一把椅子上 , 桌子上有五个碗和五只筷子 , 每人两边各放一只筷子。 哲学家们是交替思考和进餐 , 饥饿时便试图取其左右最靠近他的筷子
2、。条件:只有拿到两只筷子时 , 哲学家才能吃饭。如果筷子已被别人拿走 , 则必须等别人吃完之后才能拿到筷子。任意一个哲学家在自己未拿到两只筷子吃饭前 , 不会放下手中拿到的筷子。2总体设计思想与相关知识2.1总体设计思想哲学家的生活就是思考和吃饭,即思考,饿了就餐,再思考,循环往复。要求是:每一个哲学家只有在拿到位于他左右的筷子后,才能够就餐;哲学家只能先拿左边的筷子,再去拿右边的筷子,而不能同时去抓他两边的筷子,也不能从其他哲学家手中抢夺筷子;哲学家每次就餐后必须放下他手中的两把筷子后恢复思考,不能强抓住餐具不放。设计一个程序,能够显示当前各哲学家的状态和桌上餐具的使用情况,并能无死锁的推算
3、出下一状态各哲学家的状态和桌上餐具的使用情况。 即设计一个能安排哲学家正常生活的程序。2.2 问题描述可能出现死锁问题,因为当五个哲学家都饥饿时,都拿着一支筷子,这样就可能五个哲学家都用不上餐。2.3 解决方案最多允许 4 个哲学家同时坐在桌子周围。给所有哲学家编号,奇数号的哲学家必须首先拿左边的筷子,偶数号的哲学家则反之。为了避免死锁,把哲学家分为三种状态,思考,饥饿,进食,仅当一个哲学家左右两边的筷子都可用时,才允许他拿筷子,并且一次拿到两只筷子,否则不拿。3数据结构及流程图3.1 数据结构philosopherProc+myid:int+mystate:int+philosopherPr
4、oc(LPVOIDlpParameter)+ResumeThread(hPhilosopheri):int+strcpy(stateStr, ):int程序中定义一个哲学家类,包含两个私有对象和四个公有对象。myid 对象:报讯哲学家的编号。mystate 对象:用于保存当前该哲学家的状态,philosopherProc( LPVOID lpParameter)方法:哲学家类构造函数,PHILOSOPHER_NUM表示哲学家编号ResumeThread(hPhilosopheri)方法:返回该哲学家编号strcpy(stateStr, )方法:返回哲学家当前状态根据题目要求改变哲学家的状态(饥
5、饿- 进餐 - 思考 - 饥饿)3.2 流程图开始mystate=THINKIN ;(初始状态为THINKING)While(先检查左筷子是否可用)检查右筷子是否可用改变哲学家的状态为 DINING放下两支筷子,改变哲学家的状态为THINGKING结束查看下一个哲学家放下左筷子4源代码 (c+)/ 哲学家就餐问题的解法#include #include #include #include #include #include using namespace std;/命名空间 std 内定义的所有标识符都有效const unsigned int PHILOSOPHER_NUM=5; /哲学家数目
6、const char THINKING=1;/*标记当前哲学家的状态 ,1 表示等待 ,2表示得到饥饿 ,3 表示正在吃饭 */const char HUNGRY=2;const char DINING=3;HANDLE hPhilosopher5;/定义数组存放哲学家/*HANDLE(句柄 ) 是 windows 操作系统中的一个概念。指的是一个核心对象在某一个进程中的唯一索引*/HANDLE semaphorePHILOSOPHER_NUM;/ semaphore用来表示筷子是否可用HANDLE mutex;/ MutexDWORD WINAPI philosopherProc( LPVO
7、ID lpParameter)用来控制安全输出/返回 DWORD(32 位数据)的 API函数 philosopherProcint myid;char idStr128;char stateStr128;char mystate;int ret;unsigned int leftFork;/左筷子unsigned int rightFork;/右筷子myid = int(lpParameter);itoa(myid, idStr, 10);WaitForSingleObject(mutex, INFINITE);cout philosopher myid begin. endl;Releas
8、eMutex(mutex);mystate = THINKING;/THINKING初始状态为leftFork = (myid) % PHILOSOPHER_NUM;rightFork = (myid + 1) % PHILOSOPHER_NUM;while (true)switch(mystate)case THINKING:mystate = HUNGRY;/strcpy(stateStr, HUNGRY);break;case HUNGRY:strcpy(stateStr, HUNGRY);ret = WaitForSingleObject(semaphoreleftFork, 0);/
9、可用if (ret = WAIT_OBJECT_0)ret = WaitForSingleObject(semaphorerightFork, 0); /改变状态先检查左筷子是否左筷子可用就拿起,再检查右筷子是否可用if (ret = WAIT_OBJECT_0)mystate = DINING;/右筷子可用,就改变自己的状态strcpy(stateStr, DINING);elseReleaseSemaphore(semaphoreleftFork, 1, NULL);/如果右筷子不可break;case DINING:吃完后把两支筷子都放下ReleaseSemaphore(semaphor
10、eleftFork, 1, NULL); ReleaseSemaphore(semaphorerightFork, 1, NULL);mystate = THINKING; / 改变自己的状态 strcpy(stateStr, THINKING);break;输出状态WaitForSingleObject(mutex, INFINITE);cout philosopher myid is : stateStr endl; ReleaseMutex(mutex);sleep a random time : between 1 - 5 sint sleepTime;sleepTime = 1 +
11、(int)(5.0*rand()/(RAND_MAX+1.0);Sleep(sleepTime*10);int main()int i;srand(time(0);mutex = CreateMutex(NULL, false, 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结果分析对哲学家进行编号,将他们的初始状态全部设定为 THINGKING,接着先从 0 开始改变他们的状态为 HUNGRY,继续运行后 4 号和 2 号哲学家先 DINING,3 号和 1 号哲学家为HUNGRY,当 4 号哲学家吃完后, 0 号哲学家就开始 DINING。7总结及心得体会这次操作
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025年中国机筛片市场调查研究报告
- 2025年中国对硝基苯乙酸市场调查研究报告
- 2025年中国功能性过滤器市场调查研究报告
- 2023年北京下半年监理工程师考试合同管理仲裁试题
- 小产权所有业主自治合同(2篇)
- 2025-2030整流器行业行业风险投资发展分析及投资融资策略研究报告
- 2025-2030散装盐行业市场现状供需分析及投资评估规划分析研究报告
- 2025-2030废油提炼燃料油市场前景分析及投资策略与风险管理研究报告
- 2025-2030工程监理行业市场发展分析及发展前景与投资机会研究报告
- 2025-2030宠物饲料产品入市调查研究报告
- 2025年中国高压注射器行业发展策略、市场环境及前景研究分析报告
- 宁德时代供应商申请入库教程
- 手术患者转运交接课件
- Unit+6+The+power+of+plants+大单元教学设计2024-2025学年外研版英语七年级上册+
- 四川大学华西口腔医学院课件
- 中华民族共同体概论讲座第一讲中华民族共同体基础理论课件
- 第六章-GIS分析导论
- 《LED显示屏介绍》课件
- 美容预付消费合同范例
- 儿科医疗纠纷防范
- DB41T 2406-2023 锅炉低氮改造安全防控要求
评论
0/150
提交评论