




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、操 作 系 统 课 程 设 计课程设计报告课题:利用信号量和多线程机制实现“哲学家进餐”问题 所在学院:信息工程学院班级:计科1201学号:121404114姓 名:魏祥指导教师:徐向英2015年1月1日目录3二、课题内容 3三、设计思路 3四、源代码5五、运行与测试 9六、心得体会10一、课程设计目标学习多线程编程,使用线程的同步机制实现 “哲学家进餐”问题。具体要求:1 .创建POSIX 线程,实现多线程的并发执行,验证多线程共享进程资源的特性。2 .使用互斥量和条件变量,或使用信号量实现线程的同步互斥。3 . 验证 “哲学家进餐” 问题中的死锁情况,并加以解决。二、课题内容哲学家进餐问题
2、由 Dijkstra 提出,问题描述有五个哲学家共用一张圆桌,分别坐在周围的五张椅子上, 在圆桌上有五个碗和五支筷子, 他们的生活方式是交替地进行思考和进餐。 平时, 一个哲学家进行思考, 饥饿时便试图取用其左右最靠近他的筷子, 只有在他拿到两只筷子时才能进餐。 进餐完毕, 放下筷子继续思考。本次课题要求使用多线程和信号量解决哲学家进餐问题。 并演示产生死锁的情况。三、设计思路经分析可知,放在桌子上的筷子是临界资源,在一段时间内只允许以为哲学家使用。 为了实现对筷子的互斥, 可以用一个信号量表示一只筷子, 由着五个信号量构成信号量数组。当哲学家饥饿时总是先去拿左筷子,成功后在拿右筷子。当五位哲
3、学家同时拿起左筷子,这是每位哲学家都没有右筷子可以拿,就会造成死锁。思路 1:利用记录型信号量设置值为 4 的记录型信号量,至多只允许四位哲学家同时去拿左筷子(leftStick.getSema().acquire(),只有拿到左筷子,才能继续拿右筷子(rightStick.getSema().acquire()。拿到两双筷子之后便可以用餐,用餐完毕,先放下左筷子(leftStick.getSema().release)() ,再放下右筷子(rightStick.getSema().release() 。这样便可以避免思索问题。思路2:利用AND 型信号量要求每个哲学家必须获取两个筷子的时候才
4、能够进餐,只得到一只筷子不能进餐时,要求释放那一只筷子。可以使用 AND 型信号量将左筷子和右筷 子信号量的获取组成一个原子操作。如此也可以避免死锁问题。本次课程设计是在windows系统下完成,编程语言为java,开发环 境:Eclipse。由于在java语言中使用记录型信号量更为方便,所以本次课题我使用的是思路一。static Semaphore room = new Semaphored);设置值为4的记录型信号量,至多只允许四个哲学家同时拿起左筷子。private Semaphore semaphore = new Semaphore。);在筷子类中为筷子设置值为1信号量。room.a
5、cquire();/获取值为4的信号量leftStick .getSema().acquire();/ 获取左筷子信号量Thread. sleep (1000 * 1);/拿到左筷子之后等待2秒,观察死锁rightStick .getSema().acquire(); / 获取右筷子信号量 eat();Thread. sleep (1000 * 2);/用完餐后等待2秒,继续思考finishEat();leftStick.getSema().release();/ 释放左筷子信号量rightStick .getSema().release();/ 释放右筷子信号量room.release();
6、/释放值为4的信号量当需要演示死锁的情况是,只需要将room.acquire(); 和room.release();这两行注释掉,取消至多只允许四位哲学家一起拿起左筷子的限制,就会产生死 锁。ChopStick口chopStick = new ChopStick5;for (int i = 0; i < 5; i +) chopStick i = new ChopStick( i );INew出编号0到4的五支筷子。Philosopherph0 =new Philosopher(0,chopStick0,chopStick1);Philosopherph1 =new Philosophe
7、r。chopStick1,chopStick2);Philosopherph2 =new Philosopher(2,chopStick2,chopStick3);Philosopherph3 =new Philosopher(3,chopStick3,chopStick4);Philosopherph4 =new Philosopher(4,chopStick4,chopStick0);New出编号0到4的五位哲学家,他们分别对应着自己的左、右两支筷子。ExecutorService excutor = Executors. newFixedThreadPool (5);5位哲学家用餐,所以
8、需要 5个线程同时执行,创建容量为 5的线程池。四、源代码/在Windows下运行,筷子类(ChopStick.java)public class ChopStick private int ID;private boolean available;private Semaphore semaphore = new Semaphore(1);public ChopStick(int ID)this.ID = ID;this.available = true;this.semaphore = new Semaphore(1);public void setAvai(boolean availab
9、le) this.available = available;public boolean getAvai() return this.available;public Semaphore getSema() return this.semaphore;public void setSema(Semaphore sema) this.semaphore = sema;public int getId() return this.ID;哲学家类 (Philosopher.java)public class Philosopher implements Runnableprivate int ID
10、;static Semaphore room = new Semaphore(4);private ChopStick leftStick;private ChopStick rightStick;public Philosopher(int ID, ChopStick cs1, ChopStick cs2) this.ID = ID;this.leftStick = cs1;this.rightStick = cs2;public void getLeftChopStick()public int getId()return ID;public void eat()leftStick.set
11、Avai(false);rightStick.setAvai(false);public void think()public void finishEat()leftStick.setAvai(true);rightStick.setAvai(true);public void readyToEat()public void cannotEat()public void run()tryroom.acquire();this.readyToEat();this.cannotEat();Thread.sleep(1000 * 1);this.eat();Thread.sleep(1000 *
12、2);this.finishEat();room.release();catch(InterruptedException ex) ex.toString();测试 (Test.java)public class Test public static void main(String args)Scanner input = new Scanner(System.in);menu();int choice = input.nextInt();while(choice != 1)if(choice = 0)ChopStick chopStick = new ChopStick5;for(int
13、i = 0; i < 5; i +)chopSticki = new ChopStick(i);ExecutorService excutor = Executors.newFixedThreadPool(5);Philosopher ph0 = new Philosopher(0, chopStick0, chopStick1); excutor.execute(new Philosopher(0, chopStick0, chopStick1); excutor.execute(new Philosopher(1, chopStick1, chopStick2); excutor.e
14、xecute(new Philosopher(2, chopStick2, chopStick3); excutor.execute(new Philosopher(3, chopStick3, chopStick4); excutor.execute(new Philosopher(4, chopStick4, chopStick0);excutor.shutdown();choice = input.nextInt();menu();public static void menu()五、运行与测试1. 运行界面2. 死锁演示3. 无死锁演示六、心得体会本次课程设计我总得来说花的时间不是太多,代码加起来一共不超过两百行。我只用了一种思路来完成。思路一完成之后,我也尝试着用思路二完成,但是 AND 型信号量的问题很难解决,最后便放弃了。拿到课题之前我对哲学家进餐问题了解的还不是很透彻,我利用网络和查询课本彻底搞懂了哲学家进餐问题。 并且得到两种解决思路。 通过此次的课程设计, 我想我对多线程的编程理解更深了一点, 虽然说死锁的出现几率不是非常的大, 但是还是有可能会出现, 一旦出现,程序就会锁在哪里,不能继
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- AR音乐教室的用户界面优化-洞察阐释
- 2025-2030中国正交斜齿轮减速器行业市场发展趋势与前景展望战略研究报告
- 2025-2030中国机场射频识别系统行业市场发展趋势与前景展望战略研究报告
- 2025-2030中国有机玫瑰天竺葵精油行业市场发展趋势与前景展望战略研究报告
- 2025-2030中国智能电子驱动行业市场发展趋势与前景展望战略研究报告
- 2025-2030中国智慧矿山解决方案行业市场现状分析及竞争格局与投资发展研究报告
- 2025-2030中国无烟原煤行业市场现状供需分析及市场深度研究发展前景及规划可行性分析研究报告
- 医疗健康数据管理区块链与大数据的联合应用
- 2025-2030中国收藏品拍卖服务行业现状供需分析及市场深度研究发展前景及规划可行性分析研究报告
- 2025-2030中国抗酸药甘草制剂行业市场发展分析及发展趋势与投资风险研究报告
- GB/T 32960.3-2025电动汽车远程服务与管理系统技术规范第3部分:通信协议及数据格式
- 2024年四川省公安厅招聘警务辅助人员真题
- 2025年电子信息工程师职业资格考试试卷及答案
- 2025年广东松山职业技术学院单招职业倾向性测试题库
- 甘肃武威事业单位招聘考试高频题库带答案2025年
- 机械制造及非标零部件加工项目突发环境事件应急预案
- 2025年绍兴市九年级中考语文一模试卷附答案解析
- 9.1科学立法 课件高中政治统编版必修三政治与法治
- 施工现场临时用电安全
- 2025年湖北省鄂州市荆楚联盟中考模拟生物试题(一)(含答案)
- 纳税实务电子教案
评论
0/150
提交评论