




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
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、近他的筷子.条件:(1)只有拿到两只筷子时,哲学家才能吃饭.(2)如果筷子已被别人拿走,那么必须等别人吃完之后才能拿到筷子.(3)任意一个哲学家在自己未拿到两只筷子吃饭前,不会放下手中拿到的筷子.2 .总体设计思想与相关知识2.1 总体设计思想哲学家的生活就是思考和吃饭,即思考,饿了就餐,再思考,循环往复.要求是: 每一个哲学家只有在拿到位于他左右的筷子后,才能够就餐;哲学家只能先拿左边的筷 子,再去拿右边的筷子,而不能同时去抓他两边的筷子,也不能从其他哲学家手中抢夺 筷子;哲学家每次就餐后必须放下他手中的两把筷子后恢复思考,不能强抓住餐具不放.设计一个程序,能够显示当前各哲学家的状态和桌上餐
3、具的使用情况,并能无死锁 的推算出下一状态各哲学家的状态和桌上餐具的使用情况.即设计一个能安排哲学家正常生活的程序.2.2 问题描述可能出现死锁问题,由于当五个哲学家都饥饿时,都拿着一支筷子,这样就可能五 个哲学家都用不上餐.2.3 解决方案2.3.1 最多允许4个哲学家同时坐在桌子周围.2.3.2 给所有哲学家编号,奇数号的哲学家必须首先拿左边的筷子,偶数号的哲学家那么反之.2.3.3 为了防止死锁,把哲学家分为三种状态,思考,饥饿,进食,仅当一个哲学家左右两边的筷子都可用时,才允许他拿筷子,并且一次拿到两只筷子,否那么不拿.3 .数据结构及流程图3.1 数结构philosopherProc
4、+myid:int+mystate:int+philosopherProc(LPVOIDlpParameter)+ResumeThread(hPhilosopheri):int +strcpy(stateStr, ""):int程序中定义一个哲学家类,包含两个私有对象和四个公有对象.myid对象:报讯哲学家的编号.mystate对象:用于保存当前该哲学家的状态,philosopherProc( LPVOID lpParameter) 方法:哲学家类构造函数,PHILOSOPHER_NUM表示哲学家编号ResumeThread(hPhilosopheri) 方法:返回该哲学家
5、编号strcpy(stateStr,"") 方法:返回哲学家当前状态根据题目要求改变哲学家的状态(饥饿 ,进餐,思考,饥饿)3.2 流程图4. 源代码c+/哲学家就餐问题的解法#include <windows.h>#include <process.h>#include <time.h>#include <stdlib.h>#include <stdio.h>#include <iostream> using namespace std;有效/命名空间std内定义的所有标识符都const unsign
6、ed int PHILOSOPHER_NUM=5;/const char THINKING=1;表示得到饥饿,3表示正在吃饭*/const char HUNGRY=2;const char DINING=3;HANDLE hPhilosopher5;/*/*HANDLE哲学家数目标记当前哲学家的状态,1表示等待,2定义数组存放哲学家句柄是windows操作系统中的一个概念.指的是一个核心对象在某一个进程中的唯一索引*/HANDLE semaphorePHILOSOPHER_NUM; / semaphore 用来表示筷子是否可用HANDLE mutex;/ Mutex用来限制平安输出返回DWOR
7、D32位数DWORD WINAPI philosopherProc( LPVOID IpParameter) / 据)的 API 函数 philosopherProc int 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 << "
8、;philosopher " << myid << " begin" << endl;ReleaseMutex(mutex);初始状态为mystate = THINKING;/THINKINGleftFork = (myid) % PHILOSOPHER_NUM;rightFork = (myid + 1) % PHILOSOPHER_NUM;while (true)switch(mystate)case THINKING:mystate = HUNGRY;/strcpy(stateStr, "HUNGRY"
9、);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;/变自己的状态strcpy(stateStr, "DINING");)elseReleaseSemapho
10、re(semaphoreleftFork, 1, NULL); / 用,就把左筷子放下改变状态先检查左筷子是否左筷子可用就拿起,右筷子可用,就改如果右筷子不可)break;case DINING:/吃完后把两支筷子都放下ReleaseSemaphore(semaphoreleftFork, 1, NULL);ReleaseSemaphore(semaphorerightFork, 1, NULL);mystate = THINKING;/改变自己的状态strcpy(stateStr, "THINKING");break;)/ 输出状态WaitForSingleObject(
11、mutex, INFINITE);cout << "philosopher " << myid << " is : " << stateStr << endl;ReleaseMutex(mutex);/ sleep a random time : between 1 - 5 sint sleepTime;sleepTime = 1 + (int)(5.0*rand()/(RAND_MAX+1.0);Sleep(sleepTime*10);)int main()int i;srand(time(0
12、);mutex = CreateMutex(NULL, false, NULL);for (i=0; i<PHILOSOPHER_NUM; i+)semaphorei = CreateSemaphore(NULL, 1, 1, NULL);hPhilosopheri=CreateThread(NULL,0,philosopherProc,LPVOID(i), CREATE_SUSPENDED,0);)for (i=0; i<PHILOSOPHER_NUM; i+)ResumeThread(hPhilosopheri);Sleep(2000);return 0;)5. 运行结果6. 结果分析对哲学家进行编号,将他们的初始状态全部设定为 THINGKING接着先从0开始改变 他们的状态为HUNGRY继续运行后4号和2号哲学家先DINING, 3号和1号哲学家为 HUNGRY当4号哲学家吃完后,0号哲学家就开始DINING7. 总结及心得体会这次操作系统的作业让我
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 口腔正畸学考试题+答案
- 酒店智能管理服务协议
- 浙江国企招聘2025宁波市交通建设工程试验检测中心有限公司招聘17人笔试参考题库附带答案详解
- 2025赛迪工业和信息化研究院(集团)四川有限公司招聘8人笔试参考题库附带答案详解
- 2025年郑州航空大都市研究院有限公司下属公司招聘实习生2人笔试参考题库附带答案详解
- 高二单句语法填空+语篇填空 历史人物主题练 (解析版)3
- 安葬合同协议书
- 项目合作三方合同协议书
- 借款合同过期还款协议书
- 承包康复科合同协议书
- 技术学校直饮水工程施工组织设计(方案)
- 某切眼掘进工作面开口施工的安全技术措施
- 山东省病理质控
- 某医院安全生产三项制度(安全生产责任制、制度、操作规程)汇编
- 2022年我国新能源汽车产业发展趋势分析
- 国开电大《工程数学(本)》形成性考核作业5答案
- 招投标基础知识教育课件
- 西藏自治区2021年小升初数学考试真题与答案解析
- 高校毕业生就业观念:特点、变化与差异研究
- 论文联想与想象在语文教学中的应用及培养
- 形式逻辑新解知到章节答案智慧树2023年上海财经大学
评论
0/150
提交评论