欢迎来到冰点文库! | 帮助中心 分享价值,成长自我!
冰点文库
全部分类
  • 临时分类>
  • IT计算机>
  • 经管营销>
  • 医药卫生>
  • 自然科学>
  • 农林牧渔>
  • 人文社科>
  • 工程科技>
  • PPT模板>
  • 求职职场>
  • 解决方案>
  • 总结汇报>
  • ImageVerifierCode 换一换
    首页 冰点文库 > 资源分类 > DOCX文档下载
    分享到微信 分享到微博 分享到QQ空间

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

    • 资源ID:9385039       资源大小:85.87KB        全文页数:16页
    • 资源格式: DOCX        下载积分:3金币
    快捷下载 游客一键下载
    账号登录下载
    微信登录下载
    三方登录下载: 微信开放平台登录 QQ登录
    二维码
    微信扫一扫登录
    下载资源需要3金币
    邮箱/手机:
    温馨提示:
    快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。
    如填写123,账号就是123,密码也是123。
    支付方式: 支付宝    微信支付   
    验证码:   换一换

    加入VIP,免费下载
     
    账号:
    密码:
    验证码:   换一换
      忘记密码?
        
    友情提示
    2、PDF文件下载后,可能会被浏览器默认打开,此种情况可以点击浏览器菜单,保存网页到桌面,就可以正常下载了。
    3、本站不支持迅雷下载,请使用电脑自带的IE浏览器,或者360浏览器、谷歌浏览器下载即可。
    4、本站资源下载后的文档和图纸-无水印,预览文档经过压缩,下载后原文更清晰。
    5、试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。

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

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

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

    3、家及其所坐的位置。2 设定共有10个哲学家需用餐。每位用餐耗时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)设计报告规范、

    5、课程设计报告质量高、参考文献充分 20分(4)课程设计答辩时,问题回答正确; 20分(5)态度认真、刻苦钻研、遵守纪律; 10分 按上述五项分别记分后求和,总分按五级制记载最后成绩。优秀(10090分),良好(8089分),中等(7079分),及格(6069分),不及格(059分)一、设计题目:用多线程同步方法解决哲学家就餐问题二、设计思想: 1、为每个哲学家产生一个线程,设计正确的同步算法 2、每个哲学家取得一双筷子开始用餐后,即时显示“Dining”和该哲学家的自定义标识符以及餐桌上所有几位哲学家标识符及其所坐的位置。 3、设定共有10个哲学家需用餐。每位用餐耗时10秒钟以上。 4、多个哲

    6、学家须共享操作函数代码。三、系统结构 四、主要数据结构的说明和模块的算法流程图: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_t thread, void *retval);3、信号量的数据类型为结构sem_t,它本质上是一个长整型

    7、的数。初始化信号量函数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定义为102、sem_t chopsticsNUMBERS /定义5只筷子的互斥信号量chopstics3

    8、、sem_t room /定义避免死锁的同步信号量room线程共享函数伪代码:void *Share(int i)think();p(room); /请求入席进餐 p(chopsticksetnumber); /请求左手边的筷子 p(chopsticksetnumber+1); /请求右手边的筷子eat();v (chopsticksetnumber); /释放左手边的筷子v(chopsticksetnumber+1); /释放右手边的筷子 v(room); /退出席位释放信号量chairs 五、使用说明: 打开虚拟机,进入linux系统。应用程序终端输入 gcc lpthread o a.a

    9、.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上哲学家3坐在椅子3上哲学家4坐上了位置4哲学家1吃饱了放下筷子1和2哲学家1离开了位置1走到一边画圈圈哲学家3

    10、吃饱了放下筷子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上哲学家2坐在椅子2上哲学家6坐上了位置3哲学家6拿到左侧筷子3哲学家6拿到右侧筷子4哲学家6坐在3椅子上吃饭d

    11、ining*哲学家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*哲学家7坐在椅子1上哲学家8坐在椅子2上哲学家8吃饱了放下筷子2和3哲学家7拿到右侧筷子2哲学家7坐在1

    12、椅子上吃饭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、者是有哲学家在座位上却吃不到饭(死锁)的问题。所有的哲学家都可以去画圈圈。八、 心得体会: 虽然这次课程设计用了一星期,但是通过查阅资料,还是有了很大的收获,使我对操作系统的基本知识有了进一步的提高,并在实践中对各种概念有了进一步的深化。初看别人的编程,根本就不知道写的是什么。只知道不停的运行,却一直得不到结果,坐着干着急。后来,慢慢地从一点一滴的学习中,能够将程序读懂了,这就是最大的进步。通过这次课程设计,我确实学到了很多东西,这些学到的东西可以使我受益终生。除了知识技术上的东西,我更锻炼了自己的快速学习能力。总的来说,这次的课程设计的收获比较大,对LINUX的运用以及编程都更进了一步。一个

    14、看似小程序,却包含了很多辛劳,没有扎实的理论基础和熟练地操作是很难在短时间内完成作品的。九、附录:#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,3,4;/设置椅子int i,j;/设置2循环用变量void *Share(int threadid);

    15、/定义哲学家函数/主函数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,(void *)Share,(void *)i);if(error)/判断是否产生哲学家printf(nE

    16、RROR: 哲学家没有被创建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=0)yourensetnumber=i; /让哲学家去坐座位,并修改有人编号为哲学家编号printf(哲

    17、学家%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(哲学家%d坐在%d椅子上吃饭n,i,chairssetnumber-1);printf(diningn);pri

    18、ntf(*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,setnumber+1);sem_wait(&yourenmutex);/有人互斥yourensetnumber=0;

    19、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 是标志线程的头文件指导教师评语: 签名: 年 月 日


    注意事项

    本文(用多线程同步方法解决哲学家就餐问题报告剖析.docx)为本站会员主动上传,冰点文库仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰点文库(点击联系客服),我们立即给予删除!

    温馨提示:如果因为网速或其他原因下载失败请重新下载,重复下载不扣分。




    关于我们 - 网站声明 - 网站地图 - 资源地图 - 友情链接 - 网站客服 - 联系我们

    copyright@ 2008-2023 冰点文库 网站版权所有

    经营许可证编号:鄂ICP备19020893号-2


    收起
    展开