用多线程同步方法解决哲学家就餐问题报告

上传人:卷*** 文档编号:123795132 上传时间:2022-07-23 格式:DOC 页数:17 大小:107.50KB
收藏 版权申诉 举报 下载
用多线程同步方法解决哲学家就餐问题报告_第1页
第1页 / 共17页
用多线程同步方法解决哲学家就餐问题报告_第2页
第2页 / 共17页
用多线程同步方法解决哲学家就餐问题报告_第3页
第3页 / 共17页
资源描述:

《用多线程同步方法解决哲学家就餐问题报告》由会员分享,可在线阅读,更多相关《用多线程同步方法解决哲学家就餐问题报告(17页珍藏版)》请在装配图网上搜索。

1、课程设计报告书课程名称: 计算机操作系统 题 目: 用多线程同步措施解决哲学家就餐问题 系 名:专业班级:姓 名:学 号:指引教师: 年 6 月 24 日武汉华夏理工学院信息工程系课 程 设 计 任 务 书课程名称: 操作系统原理课程设计 指引教师: 班级名称: 开课系、教研室: 自动化与计算机 一、课程设计目的与任务操作系统课程设计是操作系统原理课程的后续实践课程,旨在通过一周的实践训练,加深学生对理论课程中操作系统概念,原理和措施的理解,加强学生综合运用操作系统原理、Linux系统、C语言程序设计技术进行实际问题解决的能力,进一步提高学生进行分析问题和解决问题的能力,涉及系统分析、系统设计

2、、系统实现和系统测试的能力。学生将在指引教师的指引下,完毕从需求分析,系统设计,编码到测试的全过程。二、课程设计的内容与基本规定1、课程设计题目 用多线程同步措施解决哲学家就餐问题2、课程设计内容本课程设计规定在Linux操作系统,GCC编译环境下开发。用c/c+语言在Linux操作系统环境下,通过研究Linux的线程机制和信号量实现哲学家就餐问题的并发控制。为避免死锁,可采用只许4个哲学家入席且桌上有5支筷子的措施。几把椅子可用持续存储单元。1 每个哲学家获得一双筷子开始用餐后,即时显示“Dining”和该哲学家的标记符以及餐桌上有几位哲学家及其所坐的位置。2 设定共有10个哲学家需用餐。每

3、位用餐耗时10秒钟以上。3 多种哲学家须共享操作函数代码。提示:1 有界缓冲区/持续存储区可用数组实现。2 编译命令可用:gcc -lpthread -o 目的文献名源文献名3 多线程编程措施参见电子文档。 3、设计报告撰写格式规定:1设计题目与规定 2 设计思想 3系统构造 4 数据构造的阐明和模块的算法流程图 5 使用阐明书(即顾客手册):内容涉及如何登录、退出、读、写等操作阐明6 运营成果和成果分析(其中涉及实验的检查成果、程序的运营状况)7 自我评价与总结 8 附录:程序清单,注意加注释(涉及核心字、措施、变量等),在每个模块前加注释;三、课程设计环节及时间进度和场地安排本课程设计将安

4、排在第18周, 现代教育技术中心。具体安排如下:时间设计内容第一天下发任务书,学生查阅资料第二天系统设计和原型开发第三天-第四天系统功能实现、系统调试、测试、打包和验收第五天整顿报告课程设计集中时间安排:周次星期一星期二星期三星期四第18周第1-2节第3-4节第3-4节第3-6节地点现教现教现教现教四、课程设计考核及评分原则课程设计考核将综合考虑学生的系统设计方案、运营成果、课程设计报告书的质量、态度、考勤、答辩状况等各因素。具体评分原则如下:(1)设计方案对的,具有可行性、创新性; 30分(2)系统开发效果较好; 20分(3)设计报告规范、课程设计报告质量高、参照文献充足 20分(4)课程设

5、计答辩时,问题回答对的; 20分(5)态度认真、刻苦钻研、遵守纪律; 10分 按上述五项分别记分后求和,总分按五级制记载最后成绩。优秀(10090分),良好(8089分),中档(7079分),及格(6069分),不及格(059分)一、设计题目:用多线程同步措施解决哲学家就餐问题二、设计思想: 1、为每个哲学家产生一种线程,设计对的的同步算法 2、每个哲学家获得一双筷子开始用餐后,即时显示“Dining”和该哲学家的自定义标记符以及餐桌上所有几位哲学家标记符及其所坐的位置。 3、设定共有10个哲学家需用餐。每位用餐耗时10秒钟以上。 4、多种哲学家须共享操作函数代码。三、系统构造 开始设立哲学家

6、与否有座位?等待坐座位左边与否有筷子?等待拿起左边的筷子右边与否有筷子?拿起右边的筷子哲学家吃饭,吃完了离开座位,一边画圈圈结束等待YYYNNN四、重要数据构造的阐明和模块的算法流程图:1、创立函数pthread_create声明如下:#include Int pthread_create(pthread_t *thread, const pthread_attr_t *attr, void*(*start_routine) (void *), void *arg); 2、等待其他线程结束函数pthread_join声明如下:#include int pthread_join(pthread_

7、t thread, void *retval);3、信号量的数据类型为构造sem_t,它本质上是一种长整型的数。初始化信号量函数sem_init声明如下: #include sem_init (sem_t *sem, int pshared, unsigned int value);4、增长信号量值函数sem_post声明如下:#include int sem_post(sem_t *sem);5、减少信号量值函数sem_wait声明如下#include int sem_wait(sem_t * sem);重要数据构造声明:1、#define NUMBERS 10 /将哲学家人数NUMBERS

8、定义为102、sem_t chopsticsNUMBERS /定义5只筷子的互斥信号量chopstics3、sem_t room /定义避免死锁的同步信号量room线程共享函数伪代码:void *Share(int i)think();p(room); /祈求入席进餐 p(chopsticksetnumber); /祈求左手边的筷子 p(chopsticksetnumber+1); /祈求右手边的筷子eat();v (chopsticksetnumber); /释放左手边的筷子v(chopsticksetnumber+1); /释放右手边的筷子 v(room); /退出席位释放信号量chair

9、s 五、使用阐明: 打开虚拟机,进入linux系统。应用程序终端输入 gcc lpthread o a.a.c编码成功后,输入./a ,得到所需成果。六、运营成果和成果分析: 如图1、2所示: 图1图2syhlocalhost $ gcc -lpthread -o a a.csyhlocalhost $ ./a哲学家1坐上了位置1哲学家1拿到左侧筷子1哲学家1拿到右侧筷子2哲学家1坐在1椅子上吃饭dining*哲学家1坐在椅子1上哲学家2坐上了位置2哲学家3坐上了位置3哲学家3拿到左侧筷子3哲学家3拿到右侧筷子4哲学家3坐在3椅子上吃饭dining*哲学家1坐在椅子1上哲学家2坐在椅子2上哲学

10、家3坐在椅子3上哲学家4坐上了位置4哲学家1吃饱了放下筷子1和2哲学家1离开了位置1走到一边画圈圈哲学家3吃饱了放下筷子3和4哲学家3离开了位置3走到一边画圈圈哲学家2拿到左侧筷子2哲学家2拿到右侧筷子3哲学家2坐在2椅子上吃饭dining*哲学家2坐在椅子2上哲学家5坐上了位置1哲学家5拿到左侧筷子1哲学家4拿到左侧筷子4哲学家4拿到右侧筷子5哲学家4坐在4椅子上吃饭dining*哲学家5坐在椅子1上哲学家2坐在椅子2上哲学家2吃饱了放下筷子2和3哲学家4吃饱了放下筷子4和5哲学家4离开了位置4走到一边画圈圈哲学家5拿到右侧筷子2哲学家5坐在1椅子上吃饭dining*哲学家5坐在椅子1上哲学

11、家2坐在椅子2上哲学家6坐上了位置3哲学家6拿到左侧筷子3哲学家6拿到右侧筷子4哲学家6坐在3椅子上吃饭dining*哲学家5坐在椅子1上哲学家2坐在椅子2上哲学家6坐在椅子3上哲学家2离开了位置2走到一边画圈圈哲学家8坐上了位置2哲学家9坐上了位置4哲学家5吃饱了放下筷子1和2哲学家5离开了位置1走到一边画圈圈哲学家6吃饱了放下筷子3和4哲学家6离开了位置3走到一边画圈圈哲学家8拿到左侧筷子2哲学家8拿到右侧筷子3哲学家8坐在2椅子上吃饭dining*哲学家8坐在椅子2上哲学家7坐上了位置1哲学家7拿到左侧筷子1哲学家9拿到左侧筷子4哲学家9拿到右侧筷子5哲学家9坐在4椅子上吃饭dining

12、*哲学家7坐在椅子1上哲学家8坐在椅子2上哲学家8吃饱了放下筷子2和3哲学家7拿到右侧筷子2哲学家7坐在1椅子上吃饭dining*哲学家7坐在椅子1上哲学家8坐在椅子2上哲学家9吃饱了放下筷子4和5哲学家9离开了位置4走到一边画圈圈哲学家8离开了位置2走到一边画圈圈哲学家10坐上了位置3哲学家10拿到左侧筷子3哲学家10拿到右侧筷子4哲学家10坐在3椅子上吃饭dining*哲学家7坐在椅子1上哲学家10坐在椅子3上哲学家7吃饱了放下筷子1和2哲学家7离开了位置1走到一边画圈圈哲学家10吃饱了放下筷子3和4哲学家10离开了位置3走到一边画圈圈七、测试过程及成果分析: 各个哲学家(线程)完全独立自

13、主运作,达到了预期的目的,拿筷子自 然无冲突,吃饭也能正常运营,全程序没有一种哲学家饿死(线程不执行),或者是有哲学家在座位上却吃不到饭(死锁)的问题。所有的哲学家都可以去画圈圈。八、 心得体会: 虽然这次课程设计用了一星期,但是通过查阅资料,还是有了很大的收获,使我对操作系统的基本知识有了进一步的提高,并在实践中对多种概念有了进一步的深化。初看别人的编程,主线就不懂得写的是什么。只懂得不断的运营,却始终得不到成果,坐着干着急。后来,慢慢地从一点一滴的学习中,可以将程序读懂了,这就是最大的进步。通过这次课程设计,我的确学到了诸多东西,这些学到的东西可以使我受益终身。除了知识技术上的东西,我更锻

14、炼了自己的迅速学习能力。总的来说,这次的课程设计的收获比较大,对LINUX的运用以及编程都更进了一步。一种看似小程序,却涉及了诸多辛苦,没有夯实的理论基本和纯熟地操作是很难在短时间内完毕作品的。九、附录:#include #include #include #include #define NUMBERS 10/设立哲学家数目sem_t chopstics5;/设立筷子数目sem_t room; /设立房屋信号灯sem_t mutex;/设立互斥信号灯sem_t yourenmutex;/设立有人互斥信号灯int youren5=0,0,0,0,0;/设立是人变量int chairs4=1,2

15、,3,4;/设立椅子int i,j;/设立2循环用变量void *Share(int threadid);/定义哲学家函数/主函数int main()int error;/设定错误变量pthread_t threadsNUMBERS;/设立线程数for(i=0;i5;i+)/循环设立筷子信号灯sem_init(&chopsticsi,0,1);sem_init(&room,0,4);/设立房间信号灯sem_init(&mutex,0,1);/设立互斥信号灯for(i=1;iNUMBERS+1;i+)/建立十个哲学家线程error = pthread_create(&threadsi,NULL,

16、(void *)Share,(void *)i);if(error)/判断与否产生哲学家printf(nERROR: 哲学家没有被创立n);for(i=1;iNUMBERS+1;i+)/启动十个哲学家线程pthread_join(threadsi,NULL);/哲学家函数void *Share(int threadid)int i = threadid;/读取哲学家编号int setnumber=1;/设立座位量sem_wait(&room);/room信号-1for(setnumber=1;setnumber=4;setnumber+)/检测哪个位置空出来if(yourensetnumber

17、=0)yourensetnumber=i; /让哲学家去坐座位,并修改有人编号为哲学家编号printf(哲学家%d坐上了椅子%dn,i,setnumber);sem_post(&yourenmutex);/解除有人互斥break;sem_wait(&chopsticssetnumber);/拿起左边筷子信号灯printf(哲学家%d拿到左侧筷子%dn,i,setnumber);sem_wait(&chopsticssetnumber+1);/拿起右边筷子信号灯printf(哲学家%d拿到右侧筷子%dn,i,setnumber+1);sem_wait(&mutex);/互斥printf(哲学家%

18、d坐在%d椅子上吃饭n,i,chairssetnumber-1);printf(diningn);printf(*n);for(j=0;j4;j+)if(yourenj!=0)printf(哲学家%d坐在椅子%d上n,yourenj,chairsj-1);printf(n);sem_post(&mutex);/解除互斥sleep(1);/吃十秒sem_post(&chopsticssetnumber);/放下左边筷子信号灯sem_post(&chopsticssetnumber+1);/放下右边筷子信号灯printf(哲学家%d吃饱了放下筷子%d和%dn,i,setnumber,setnumb

19、er+1);sem_wait(&yourenmutex);/有人互斥yourensetnumber=0;printf(n哲学家%d离开了椅子%d走到一边画圈圈nn,i,setnumber);sem_post(&yourenmutex);/解除有人互斥sem_post(&room);/room信号灯+1设计过程中质疑(或答辩)记载:1、 如何避免死锁? 针对每个哲学家,通过共享操作函数代码,分别建立5个线程,以实现同步哲学家就餐, 而申请进入餐厅的哲学家进入room 的等待队列,根据FIFO 的原则,总会进入到餐厅就餐,因此不会浮现饿死和死锁的现象2、 哲学家左边的筷子具体是什么? 根据座位的编号来设立相应的筷子编号,例如1号座位相应的左边和右边的筷子是1和2,3号座位相应的筷子是2和3,按照顺序以此类推。3、 #include #include 具体表达的是什么?#include 是标志信号量的头文献#include 是标志线程的头文献指引教师评语: 签名: 年 月 日

展开阅读全文
温馨提示:
1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
2: 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
3.本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
关于我们 - 网站声明 - 网站地图 - 资源地图 - 友情链接 - 网站客服 - 联系我们

copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!