操作系统课程设计 哲学家进餐问题

合集下载

6个哲学家进餐问题预防死锁

6个哲学家进餐问题预防死锁

红河学院课程设计报告操作系统课程名称:6个哲学家进餐设计题目:院系:工学院专业:计算机科学与技术班级:11计科班曹永前设计者:学号:201101030466指导教师:韦相2013 年 5 月26 日1. 问题描述:一个房间内有6个哲学家,他们的生活就是思考和进食。

哲学家思考后,过一定的时间就会饥饿,饥饿之后就想吃饭,吃饭后再思考。

房间里有一张圆桌,桌子周围放有五把椅子,分别属于五位哲学家每两位哲学家之间有一把叉子,哲学家进食时必须同时使用左右两把叉子。

2. 问题分析1、写出哲学家进餐的算法描述。

用六只筷子解决需要用两双筷子来进餐的六个哲学家,由于每个哲学家都需要其周围的两只筷子,所以筷子是公用信号量,这久需要设置一个互斥信号量,来使六个哲学家互斥的进餐.具体做法将六个信号量设置为0-5,用pv 源于来控制信号量,并将六个哲学家分别编号为0-5.经过仔细分析我们会发现,有这样一个问题存在,就是当每个哲学家都申请到他周围的一只筷子时,由于他们每人都只有一只筷子无法进餐,没有进餐他们就无法释放他们已经得得到的筷子,这样是进餐出于一种僵局,无法继续下去,这就是死锁问题.2、死锁问题的分析与具体的解决方法。

死锁问题就是当每个哲学家都拿到且只拿到一只筷子,这样每个哲学家都无法进餐,也无法释放所得到的筷子,所以解决死锁我们就要从这入手,就是怎样去预防使所有哲学家不要同时去申请他们同一方向的筷子.根据这解决死锁的方法有以下几种:a.每一次最多只能有五个哲学家申请进餐.这样其中的一个哲学家就能申请到两只筷子,就能够进餐,再将筷子释放给其他哲学家进餐.b.用AND信号量,就是哲学家需同时申请其左右两边的筷子,两边都有资源的时候,才能让这个哲学家得到资源,这样哲学家只要申请到筷子就能进餐, 再将筷子释放给其他哲学家进餐.c.用管程机制来实现。

d.我们前面已经将每个哲学家都分配了一个编号,我们可以编号为奇数的哲学家首先去申请其左边的筷子,再去申请其右手边的筷子;让编号为偶数的哲学家,先去申请其右边的筷子,再去申请其左边的筷子.我们可以看出编号为奇数的哲学家左边,与编号为偶数的哲学家的右边为同一只筷子,当其中一个哲学家拿到此筷子后,他另一边的筷子也是空闲的,这样就能避免死锁.主程序中我使用的是最后一种避免死锁的方法.3、用C程序实现哲学家进餐。

进程同步模拟设计——哲学家就餐问题

进程同步模拟设计——哲学家就餐问题

课程设计题目进程同步模拟设计—哲学家就餐学院计算机科学与技术专业计算机科学与技术班级计算机姓名指导教师20011 年 1 月19 日需求分析1.1问题描述有五个哲学家围坐在一圆桌旁,桌中央有一盘通心粉,每人面前有一只空盘子,每两人之间放一只筷子,即共5只筷子。

每个哲学家的行为是思考和进餐。

为了进餐,每个哲学家必须拿到两只筷子,并且每个人只能直接从自己的左边或右边去取筷子。

思考时则同时将两支筷子放回原处(此图中以叉子代表筷子)规则:只有拿到两只筷子时,哲学家才能吃饭;如果筷子已经在他人手上,则该哲学家必须等到他人吃完之后才能拿到筷子;任何一个哲学家在自己没有拿到两只筷子吃饭之前,决不放下自己手中的筷子。

由此出现的问题:可能出现死锁问题,因为当五个哲学家都饥饿时,都拿着一支筷子,这样就可能五个哲学家都用不上餐1.2问题分析该问题可用记录型信号量或者是AND型信号量解决。

记录型信号量解决:经分析可知,放在桌子上的筷子是临界资源,在一段时间内只允许一位哲学家使用,为了实现对筷子的互斥使用,可以用一个信号量表示一只筷子,由这五个信号量组成信号量数组。

当哲学家饥饿时总是先拿其左边的筷子,成功后,再去拿右边的筷子,又成功后方可就餐。

进餐完,又先放下他左边的筷子,再放下右边筷子。

这个算法可以保证不会有两个相邻的哲学家同时就餐,但有可能引起死锁。

AND型信号量解决:在哲学家就餐过程中,要求每个哲学家先获得两个临界资源后方能就餐,这在本质上就是AND同步问题,故用AND信号量机制可获得最简洁的解法。

1.3解决方法对于死锁问题可采取这样的几种解决方法:(1)至多只允许四个哲学家同时进餐,以保证至少有一个哲学家可以进餐,最终总会释放出他所用过的两只筷子,从而可使更多的哲学家进餐;(2)仅当左右两只筷子均可用时,才允许哲学家拿起筷子就餐(3)规定奇数号哲学家先拿起右边筷子,然后再去拿左边筷子,而偶数号哲学家则相反。

(4)把筷子顺序编号 fk0, fk1, fk2, fk3, fk4,给每个哲学家分配筷子时,必须依从小号到大号(或者相反顺序)进行。

进程同步模拟设计——哲学家就餐问题

进程同步模拟设计——哲学家就餐问题

进程同步模拟设计——哲学家就餐问题课程设计题⽬进程同步模拟设计—哲学家就餐学院计算机科学与技术专业计算机科学与技术班级计算机姓名指导教师20011 年 1 ⽉19 ⽇需求分析1.1问题描述有五个哲学家围坐在⼀圆桌旁,桌中央有⼀盘通⼼粉,每⼈⾯前有⼀只空盘⼦,每两⼈之间放⼀只筷⼦,即共5只筷⼦。

每个哲学家的⾏为是思考和进餐。

为了进餐,每个哲学家必须拿到两只筷⼦,并且每个⼈只能直接从⾃⼰的左边或右边去取筷⼦。

思考时则同时将两⽀筷⼦放回原处(此图中以叉⼦代表筷⼦)规则:只有拿到两只筷⼦时,哲学家才能吃饭;如果筷⼦已经在他⼈⼿上,则该哲学家必须等到他⼈吃完之后才能拿到筷⼦;任何⼀个哲学家在⾃⼰没有拿到两只筷⼦吃饭之前,决不放下⾃⼰⼿中的筷⼦。

由此出现的问题:可能出现死锁问题,因为当五个哲学家都饥饿时,都拿着⼀⽀筷⼦,这样就可能五个哲学家都⽤不上餐1.2问题分析该问题可⽤记录型信号量或者是AND型信号量解决。

记录型信号量解决:经分析可知,放在桌⼦上的筷⼦是临界资源,在⼀段时间内只允许⼀位哲学家使⽤,为了实现对筷⼦的互斥使⽤,可以⽤⼀个信号量表⽰⼀只筷⼦,由这五个信号量组成信号量数组。

当哲学家饥饿时总是先拿其左边的筷⼦,成功后,再去拿右边的筷⼦,⼜成功后⽅可就餐。

进餐完,⼜先放下他左边的筷⼦,再放下右边筷⼦。

这个算法可以保证不会有两个相邻的哲学家同时就餐,但有可能引起死锁。

AND型信号量解决:在哲学家就餐过程中,要求每个哲学家先获得两个临界资源后⽅能就餐,这在本质上就是AND同步问题,故⽤AND信号量机制可获得最简洁的解法。

1.3解决⽅法对于死锁问题可采取这样的⼏种解决⽅法:(1)⾄多只允许四个哲学家同时进餐,以保证⾄少有⼀个哲学家可以进餐,最终总会释放出他所⽤过的两只筷⼦,从⽽可使更多的哲学家进餐;(2)仅当左右两只筷⼦均可⽤时,才允许哲学家拿起筷⼦就餐(3)规定奇数号哲学家先拿起右边筷⼦,然后再去拿左边筷⼦,⽽偶数号哲学家则相反。

计算机操作系统哲学家进餐问题的教学探讨

计算机操作系统哲学家进餐问题的教学探讨

计算机操作系统哲学家进餐问题的教学探讨
计算机操作系统哲学家进餐问题是一个经典的模拟问题,用于帮助学生理解线程同步、死锁和资源管理等操作系统的核心概念。

该问题描述了n个哲学家围坐在一张圆桌周围,每个哲学家面前有一盘食物,中间有n个筷子。

哲学家需要吃饭,但是每个哲学家只能使用自己左右两边的筷子来进餐。

如果哲学家发现左边或右边的筷子被占用,就会等待,直到筷子被释放。

这个问题中存在死锁的可能性。

在教学中,可以通过演示代码或编写代码来模拟这个问题的运行情况,帮助学生理解这些概念的实际应用。

例如,可以演示如何使用锁和条件变量来解决死锁问题,或者如何
使用信号量管理系统资源来避免死锁问题。

另外可以讨论不同的算法和策略,如顺序获取筷子,随机获取筷子等,来说明如何避免死锁的发生.
总之,通过这个问题的模拟,学生可以加深对操作系统的理解,并且对如何解决多线程并发问题有更深入的了解。

在教学探讨中,老师可以通过不同的模拟实验来说明线程同步和死锁的本质原理以及如何避免和解决这些问题。

鼓励学生进行自己的实验和探究,以加深对这些概念的理解。

哲学家就餐问题

哲学家就餐问题

哲学家就餐问题哲学家就餐问题模拟数学与计算机学院课程设计说明书课程名称: 操作系统原理-课程设计课程代码: 8404061题目: 哲学家就餐问题模拟年级/专业/班: 09级信息与计算科学三班学生姓名: 徐磊学号: 312009********* 开始时间: 2012 年 05 月 14 日完成时间: 2012 年 05月 31 日课程设计成绩:学习态度及平时成绩(30)技术水平与实际能力(20)创新(5)说明书撰写质量(45)总分(100)指导教师签名:年月日哲学家就餐问题模拟I 目录1 引言................................................. 错误!未定义书签。

1.1问题的提出 ................................................................................... 错误!未定义书签。

1.2任务与分析........................................................................................ 错误!未定义书签。

2.总体设计思想及相关知识.............................. 错误!未定义书签。

2.1总体设计思想 ......................................... 错误!未定义书签。

2.2临界区互斥编程原理........................................................................ 错误!未定义书签。

3 程序运行平台........................................... 错误!未定义书签。

4 程序类的说明........................................... 错误!未定义书签。

哲学家就餐-操作系统

哲学家就餐-操作系统

衡阳师范学院操作系统课程设计报告题目哲学家就餐问题学生姓名文润学号 ******** 专业班级计算机科学与技术1402班指导教师王玉奇完成时间 2016.11.29目录一、设计要求 (2)实验目的: (2)设计要求: (2)二、运行环境 (2)三、设计思想及流程 (2)设计思想: (2)流程图: (4)主要数据结构: (5)四、运行结果 (5)五、设计心得 (6)六、参考资料 (6)七、程序清单 (7)一、设计要求1.实验目的:通过实现哲学家就餐问题的互步,深入了解和掌握进程互斥的原理。

2.设计要求:哲学家有N个,规定全体到齐后开始讨论,在讨论的间隙哲学家就餐,每人进餐时都需使用刀、叉合一把,所有哲学家刀和叉都拿到后猜能进餐。

哲学家的人数、餐桌上的布置自行设定,实现刀和叉的互斥使用算法的程序实现。

二、运行环境操作系统:Windows系统编程语言:Java语言编译软件:Eclipse三、设计思想及流程1.设计思想:对问题分析可知,目前问题的瓶颈在于:死锁。

死锁的发生必须满足以下四个必要条件:①互斥:至少有一个资源每次只能被一个进程使用,即非共享模式。

这里指每只刀叉只能被一个哲学家持有。

②占有并等待。

一个进程因请求资源而阻塞时,对已获得的资源保持不放。

③不剥夺条件:进程已获得的资源,在末使用完之前,不能强行剥夺。

这里指哲学家不能去抢别人的刀叉。

④循环等待条件:若干进程之间形成一种头尾相接的循环等待资源关系。

这四个条件是死锁的必要条件,只要系统发生死锁,这些条件必然成立,而只要上述条件之一不满足,就不会发生死锁。

在系统设计、进程调度等方面注意避免让这四个必要条件成立,如何确定资源的合理分配算法,避免进程永久占据系统资源。

此外,也要防止进程在处于等待状态的情况下占用资源。

经分析可知,放在桌子上的刀叉是临界资源,在一段时间内只允许一位哲学家使用,为了实现对刀叉的互斥使用,可以用一个信号量表示一只刀叉,由这N 个信号量组成信号量数组。

C++操作系统哲学家就餐问题课程设计报告

C++操作系统哲学家就餐问题课程设计报告

操作系统课程设计报告133301班20133481 杜闻播20133489 刘景凯20133494 裴硕2015年12月18日目录第一章引言 (1)第二章设计背景 (2)1.1 死锁 (2)1.2死锁产生的条件 (2)1.3 防止死锁 (2)1.3.1资源按序分配法 (3)1.3.2资源预分配法 (3)1.3 哲学家就餐问题 (3)第三章需求分析 (4)1.1 功能需求 (4)1.2 功能模块图 (4)第四章程序设计 (5)4.1 程序流程图 (5)4.2 模块设计 (5)4.3 模块实现 (6)4.3.1 死锁 (6)4.3.2 资源预分配 (7)4.3.3 资源按序分配 (7)第五章程序编码 (7)5.1 程序设计语言 (8)5.2 编程环境 (8)5.3 程序总体设计 (8)5.3.1 包结构设计 (8)5.3.2 总体设计思想 (8)第六章程序调试 (10)6.1 资源按序分配 (10)6.2 资源预分配 (11)6.3 死锁 (11)参考文献 (12)附录1 部分系统界面 (13)附录2 部分源程序 (14)第一章引言操作系统(Operating System,简称OS),是电子计算机系统中负责支撑应用程序运行环境以及用户操作环境的系统软件,同时也是计算机系统的核心与基石。

它的职责常包括对硬件的直接监管、对各种计算资源(如内存、处理器时间等)的管理、以及提供诸如作业管理之类的面向应用程序的服务等等。

死锁是进程并发执行过程中可能出现的现象,哲学家就餐问题是描述死锁的经典例子。

假设有几位哲学家围坐在一张餐桌旁,桌上有吃不尽的食品,每两位哲学家之间摆放着一根筷子,筷子的个数与哲学家的数量相等,每一位哲学家要么思考,要么等待,要么拿起左右两根筷子进餐。

本实验假设有五个哲学家和五根筷子,它们的编号都是从0到4。

如果每位哲学家都拿起左边的筷子,就会发生死锁。

为了防止死锁,可以采用资源预分配法或者资源按序分配法。

操作系统实验报告哲学家就餐

操作系统实验报告哲学家就餐

操作系统实验报告哲学家就餐一、实验目的:通过模拟哲学家就餐问题,了解并掌握操作系统中的进程同步机制,以及解决进程间资源竞争所引发的死锁问题。

二、实验介绍:哲学家就餐问题是由荷兰计算机科学家伊克斯特拉(Dijkstra)于1965年首次提出的。

其问题描述如下:五位哲学家坐在一张圆桌子周围,每个哲学家面前有一碗饭和一根筷子。

哲学家的生活方式是交替地进行思考和进食。

当一个哲学家思考时,他不需要使用他的两个筷子;当一个哲学家想吃饭时,他需要同时获取他的左右两个筷子,并在获取到筷子后才能开始进食。

问题的关键是如何解决哲学家间的筷子竞争问题,以及避免死锁的发生。

三、实验设计:1.并发思路每个哲学家作为一个进程,在进行思考和进食这两个操作之前,需要获取他的两个筷子。

接下来考虑进程同步的两个关键点:-互斥:保证每个筷子同时只能被一个哲学家使用,避免资源竞争问题。

-死锁避免:通过限制只允许至多四位哲学家同时持有筷子,从而避免死锁发生。

2.进程同步机制- 互斥:使用Semaphore实现互斥,每个筷子都是一个Semaphore,初始值为1-死锁避免:引入一个全局计数器,记录当前持有筷子的哲学家数量,每次哲学家想要获取筷子时,先检查该计数器,仅当计数器小于4时才会获取筷子。

四、实验步骤:1.创建5个哲学家进程和5个筷子线程。

2.每个哲学家的线程循环执行思考和进食操作。

3.在进食之前,哲学家需要获取两个筷子,获取筷子的顺序按照哲学家编号进行,每个哲学家先获取自己的左边筷子,再获取自己的右边筷子。

4.进行进食操作后,哲学家释放两个筷子。

5.循环执行步骤3和步骤4,直到实验结束。

五、实验结果:通过观察实验结果,可以看到哲学家的思考和进食操作交替进行,并且避免了死锁的发生。

六、实验总结:通过本次实验,我了解了操作系统中的进程同步机制,并学会了如何解决资源竞争和死锁问题。

在本实验中,我使用了Semaphore和全局计数器实现了互斥和死锁避免,从而成功模拟了哲学家就餐问题。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

哲学家进餐问题课程设计哲学家进餐问题设计说明书(或论文)(封面)学院名称:计算机信息与工程学院班级名称: 2012级计算机科学与技术学生姓名:操飞飞学号: 2012211296 题目:哲学家进餐问题指导教师姓名:马丽生起止日期:2014年6月3日至2014年6月30日目录第一部分:正文部分 (1)一、选题背景 (1)二、设计思路 (1)(1)总体设计思想 (1)(2)资源互斥问题 (1)三、过程论述 (2)(1)数据结构 (2)(2)程序模块 (3)四、结果分析 (6)(1)程序开始执行状态 (6)(2)哲家状态图 (6)(3)程序结束图 (8)五、结论(或总结) (9)第二部分:参考文献 (9)第三部分:指导教师评语 (10)第四部分:成绩评定 (10)附录 (11)第一部分:正文部分一、选题背景哲学家进餐问题由Dijkstra提出并解决的哲学家进餐问题(The Dinning Philosophers Problem)是典型的同步问题,该问题是描述有五个哲学家共用一张圆桌,分别坐在周围的五张椅子上,在圆桌上有五个碗和五只筷子,他们的生活方式是交替地进行思考和进餐,平时,一个哲学家进行思考,饥饿时便试图取用其左右最靠近他的筷子,只有在他拿到两只筷子时才能进餐,进餐毕,放下筷子继续思考.此次课程设计的主要内容是模拟实现资源分配。

同时要求编写和调试一个系统动态分配资源的简单模拟程序,观察死锁产生的条件,设计一个程序,能够显示当前各哲学家的状态和桌上餐具的使用情况,并能无死锁的推算出下一状态各哲学家的状态和桌上餐具的使用情况。

二、设计思路(1)总体设计思想为哲学家设计3种状态,即“等待”“进餐”“思考”。

每个哲学家重复进行“等待”->“进餐”->“思考”的行动循环。

其中:“等待”->“进餐”:只有一个哲学家处于等待进餐状态,且左右手两边的餐具都处于“空闲”状态时,可以发生这种状态改变。

此状态改变发生后,哲学家拿起左右手两边的餐具。

“进餐”->“思考”:此状态改变发生后,哲学家放下左右手上的餐具。

餐具状态由“使用中”转变为“空闲”。

“思考”->“等待”:哲学家思考结束后,无条件转入等待状态。

设计一个程序,能够显示当前各哲学家的状态和桌上餐具的使用情况,并能无死锁的推算出下一状态各哲学家的状态和桌上餐具的使用情况。

即设计一个能安排哲学家正常生活的程序。

(2)资源互斥问题不论是硬件临界资源,还是软件临界资源,多个进程必须互斥地对它进行访问。

每个进程中访问临界资源的那段代码称为临界区(Critical Section)。

每个进程中访问临界资源的那段程序称为临界区(Critical Section)(临界资源是一次仅允许一个进程使用的共享资源)。

每次只准许一个进程进入临界区,进入后不允许其他进程进入。

不论是硬件临界资源,还是软件临界资源,多个进程必须互斥地对它进行访问本程序主要使用了EnterCriticalSection (&cs)和LeaveCriticalSection (&cs)两个函数实现临界区互斥。

EnterCriticalSection (&cs)用来进入临界区,LeaveCriticalSection (&cs)用来离开临界区。

三、过程论述(1)数据结构① class Philosopher:定义一个哲学家类,包含两个私有对象和四个公有对象。

② int number,int status:用于记录哲学家编号以及用于保存当前该哲学家的状态,0表示正在等待(即处于饥饿状态)1表示得到餐具正在吃饭,2表示正在思考。

③ Philosopher(int num)方法:哲学家类构造函数,参数num表示哲学家编号。

④ find() const方法:返回该哲学家编号。

⑤ getinfo() const方法:返回哲学家当前状态。

⑥ Change()方法:根据题目要求改变哲学家的状态(等待->进餐->思考->等待…………)⑦ bool tools[5]:bool类型数组tools[6],用来保存6把餐当前状态:true 表示该餐具当前空闲,false表示该餐具当前正被使用。

⑧ Print:Print用来返回一个哲学家的状态。

⑨ toolstatus:toolstatus用来返回一个餐具的状态。

⑩ EnterCriticalSection(&cs)和LeaveCriticalSection (&cs):用来进入临界区及用来离开临界区。

(2)程序模块①主程序模块图3.1主程序模块②状态改变模块图3.2状态改变程序模块③返回哲学家状态模块图3.3哲学家状态模块④返回餐具状态模块图3.4餐具状态模块四、结果分析(1)程序开始执行状态图4.1程序开始执行状态(2)哲家状态图图4.2哲学家的状态图1图4.3哲学家状态图2 图4.4哲学家状态图3图4.5哲学家状态图4(3)程序结束图图4.6程序结束图五、结论(或总结)经过4周的时间完成了这次的课程设计,通过这次课程设计,我解决了哲学家进餐问题,加深了windows平台下信号量的理解,了解死锁的产生以及死锁的解决方法。

而且,通过这次设计,我学到了许多课本上学不到的知识,注意到了许多课本上没有提到的东西,我得到了一个很好的理论联系实际的机会,锻炼了通过理论解决实际问题的能力。

正所谓“实践出真知”,有些代码看上去没什么问题,但是实际运行起来就是不出正确结果。

代码内部可能存在逻辑或语法等方面我们平时不会注意到的小问题,通过这次课程设计,我积累了不少这样小问题的解决方法。

设计中总会遇到这样那样的问题,遇到问题势必要自己分析问题,通过各种渠道解决问题,比如利用互联网。

这次课程设计也加强了我上网查数检索问题的能力。

有些时候,学习到的知识是次要的,重要的是学习知识的方法。

第二部分:参考文献1.汤小丹,计算机操作系统[第三版],西安电子科技出版社,2007;2.黄干平,陈洛资,等.计算机操作系统.北京:科学出版社,1989;3.李勇,陈恩林.计算机体系结构.长沙:国防科技大学出版,1987;4.黄祥喜,计算机操作系统实验教程.广州:中山大学出版社,1994.学生签名:操飞飞填表日期:2014年6月15日第三部分:指导教师评语第四部分:成绩评定指导教师签名:填表日期:年月日附录#include <windows.h>#include <time.h>#include <string>#include <iostream>#include <assert.h>using namespace std; //控制活动线程数目的信号量(保护线程共享资源)bool tools[5]; //全局变量,用餐工具CRITICAL_SECTION cs; //信号量, 在线程中使用,临界区class Philosopher{private:int number;int status; /*标记当前哲学家的状态,0表示正在等待(即处于饥饿状态),1表示得到两支筷子正在吃饭,2表示正在思考*/public:Philosopher(int num=0): status(2), number(num) { }int find() const { return number; }int getinfo() const { return status; }void Change() ; //状态改变函数};void Philosopher::Change(){EnterCriticalSection (&cs) ; //进入临界区if(status==1) //正在进餐{tools[number%5]=true; //放下左手工具tools[(number+1)%5]=true; //放下右手工具status=2; //改变状态为思考}else if(status==2) //思考中{status=0; //改变状态为等待}else if(status==0) //等待中{if(tools[number%5]&&tools[(number+1)%5]) //左右手两边工具均为空闲状态{tools[number%5]=false; //拿起左手工具tools[(number+1)%5]=false; //拿起右手工具status=1;}}LeaveCriticalSection (&cs) ;}string print(Philosopher *pA){//pA->Change();int i=pA->getinfo();string str;if(i==0)str="等待";else if(i==1)str="就餐";else str="思考";return str;}string toolstatus(bool a){string state;if(a==true)state="闲";if(a==false)state="用";return state;}int main(){char con = 'y'; //判断是否继续for(int i=0;i<5;i++)tools[i]=true;Philosopher P1(1),P2(2),P3(3),P4(4),P5(5);InitializeCriticalSection (&cs) ; //初始化初始化临界区cout<<"-----------------------状态说明示意图:-----------------------"<<endl;cout<<" "<<"哲学家1号的状态"<<" "<<endl;cout<<" "<<"筷5的状态"<<" "<<"筷1的状态"<<endl;cout<<"哲学家5号的状态"<<" "<<"哲学家2号的状态"<<endl;cout<<" "<<"筷4的状态"<<" "<<"筷2的状态"<<endl;cout<<"哲学家4号的状态"<<" "<<"筷3的状态"<<" "<<"哲学家3号的状态"<<endl;cout<<"--------------------------"<<endl;cout<<"哲学家们开始生活:"<<endl;cout<<endl;cout<<endl;while(con=='y'){P1.Change();P2.Change();P3.Change();P4.Change();P5.Change();cout<<"当前状态为:"<<endl;cout<<" "<<P1.find()<<print(&P1)<<" "<<endl;cout<<" "<<toolstatus(tools[1])<<""<<toolstatus(tools[2])<<endl;cout<<P5.find()<<print(&P5)<<""<<P2.find()<<print(&P2)<<endl;cout<<" "<<toolstatus(tools[0])<<""<<toolstatus(tools[3])<<endl;cout<<P4.find()<<print(&P4)<<""<<toolstatus(tools[4])<<" "<<P3.find()<<print(&P3)<<endl;cout<<"--------------------------"<<endl;cout<<"若要继续下一状态,输入y;输入其他,结束程序:";cin>>con;Sleep(20);}DeleteCriticalSection (&cs) ; //退出资源区return 0; }。

相关文档
最新文档