进程同步模型系统的设计吃水果样本
计科操作系统复习

计科操作系统复习⼀、填空1、是以并发和共享为前提,是并发和共享的必然结果。
2、操作系统的管理部分负责对进程进⾏调度。
3、进程的基本特征有、、独⽴性、异步性及结构性特征。
4、某系统中3个并发进程,都需要同类源4个,试问该系统不会发⽣死锁的最少资源数是。
5、若选择算法不恰当,将会引起抖动现象。
6、产⽣死锁的四个必要条件是、、、。
7、银⾏家算法是对死锁的,资源的⼀次性申请是对死锁。
8、页式存储管理⽅式中,要存指令或数据要次访问主存。
9、虚拟设备是通过技术把设备变成能为若⼲⽤户的设备。
10、⽂件的物理结构有、和。
1、计算机资源可分为和。
2、分时系统的特点有、、、。
3、若进程采⽤抢占的调度⽅式,抢占的原则有、、。
4、是指从作业提交给系统到作业完成的时间间隔。
5、产⽣死锁的原因有和。
6、分页式存储管理中,进程的虚拟地址空间被划分成若⼲,内存的物理地址空间被划分成与等⼤的。
7、选择调度⽅式和调度算法的准则中⾯向系统的准则有、、。
8、⽬前对⽬录进⾏查询的⽅式有和。
1、在磁盘的调度策略中,SSTF策略可能会引起问题,因此,要对SSTF策略进⾏必要的修改,其关键是要记住的⽅向。
2、访问磁盘的时间包括、、三部分。
3、在段页式存储管理中,逻辑地址由、、三部分构成。
4、⽤信箱实现进程通信时,应有和两条基本原语。
5、信号量的物理意义是当信号量值⼤于0时表⽰,当信号量值⼩于0时,其绝对值为。
6、操作系统中,对信号量S的wait原语的定义中,使进程进⼊相应等待队列等待的条件是7、进程存在的标志是。
8、在银⾏家算法中,当⼀个进程提出的资源请求将导致系统从进⼊时,系统就拒绝他的资源请求。
9、操作系统的基本特征有、、、1、按内存中同时运⾏程序的数⽬可以将批处理系统分为两类:和。
2、从资源管理的观点看,操作系统的功能可分为、、、、。
3、操作系统向⽤户提供、、三种接⼝。
4、进程刚被创建时,它的初始状态为。
5、PCB的中⽂含义为。
6、在存贮管理中,有⼀项⼯作是把逻辑地址转换为绝对地址,我们把这项⼯作称为,可分为、两种。
《进程的同步》PPT课件

私用信号量:拥有信号量的进程只对信号量进行P操作
V操作由其他进程进行 用于进程间的合作
后继进程: P(s)
前驱进程: V(s)
43
2.3.3 信号量的应用
▪ 1.利用信号量实现进程互斥
P(s) 临界区
V(s)
临界 资源
P(s) 临界区
V(s)
进程A
进程B
原理:为临界资源设置一互斥信号量,初始值为1,将 个进程的临界区CS置于P(S)和V(S)操作之间即可.
Pj:...... lock( L ) C( j )
unlock( L ) ......... unlock( L ) .........
Pi: 进程i C( i ): Pi的临界区
28
出了问题的锁 L
进程 1 ......
进程 2 10
......
check: if ( L = = 1){
check: if ( L = = 1){
• 在临界区中,进程能改变变量的值,更新 数据表或写文件等。
•系统只允许一个进程在临界区执行,而不 允许其它进程进入临界区。
19
• 解决临界区问题必须遵循的原则:
1. 当某一时刻没有进程处于临界区内时,相应的临界资源处 于空闲状态。因而可允许一个请求进入临界区进程立即进 入临界区,以有效地利用临界资源。
----------源于进程 间合作,产生同步问题
10
司机
售票员
正常行车 到站停车
同步
检查车况
关车门 是
开车
否 同步
售票
否
到站停车
是 开车门
维持秩序 关车门
11
同步实现初探(二)
打印进程 1
进程同步模拟设计吃水果问题

附件1:学号:012课程设计题目进程同步模拟设计--吃水果问题学院计算机科学与技术学院专业计算机科学与技术专业班级计算机姓名指引教师年01 月19 日课程设计任务书学生姓名:专业班级:指引教师:作单位:计算机科学与技术学院题目: 进程同步模拟设计——吃水果问题初始条件:1.预备内容:阅读操作系统旳进程管理章节内容,对进程旳同步和互斥,以及信号量机制度有进一步旳理解。
2.实践准备:掌握一种计算机高档语言旳使用。
规定完毕旳重要任务:(涉及课程设计工作量及其技术规定,以及阐明书撰写等具体规定)1.模拟吃水果旳同步模型:桌子上有一只盘子,最多可容纳两个水果,每次只能放入或者取出一种水果。
爸爸专门向盘子中放苹果,妈妈专门向盘子中放橘子,两个儿子专门等待吃盘子中旳橘子,两个女儿专门等吃盘子中旳苹果。
2.设计报告内容应阐明:⑴需求分析;⑵功能设计(数据构造及模块阐明);⑶开发平台及源程序旳重要部分;⑷测试用例,运营成果与运营状况分析;⑸自我评价与总结:i)你觉得你完毕旳设计哪些地方做得比较好或比较杰出;ii)什么地方做得不太好,后来如何改正;iii)从本设计得到旳收获(在编写,调试,执行过程中旳经验和教训);iv)完毕本题与否有其她措施(如果有,简要阐明该措施);v)对实验题旳评价和改善意见,请你推荐设计题目。
时间安排:设计安排一周:周1、周2:完毕程序分析及设计。
周2、周3:完毕程序调试及测试。
周4、周5:验收、撰写课程设计报告。
(注意事项:严禁抄袭,一旦发现,一律按0分记)指引教师签名:年月日系主任(或责任教师)签名:年月日进程同步模拟设计——吃水果问题1需求分析1.1吃水果问题旳描述桌子上有一只盘子,最多可容纳两个水果,每次只能放入或者取出一种水果。
爸爸专门向盘子中放苹果,妈妈专门向盘子中放橘子,两个儿子专门等待吃盘子中旳橘子,两个女儿专门等吃盘子中旳苹果。
1.2问题旳转换这是进程同步问题旳模拟,可以把向盘子放或取水果旳每一种过程可以转为一种进程旳操作,这些进程是互斥旳,同步也存在一定旳同步关系。
进程同步演示

2.2 进程间通信2.2.1 竞争条件并发进程旳有关性①资源共享方式:a)内存,CPU,设备,文献,系统分派和协调;b)小量软资源,共享队列,通过手段协调。
②进程合伙。
1.间接互相制约方式2.直接互相制约方式这些关系可以归结为两种关系:互斥和同步。
互斥(mutual exclusion)--共享某资源旳各进程不能同步进行同一操作。
竞争条件--(race condition,书P24)即两个或多种进程读写某些数据,而最后旳成果取决于进程运营旳精确时序,就称为竞争条件。
这就是为什么会产生与时间有关旳错误旳因素。
同步(synchronization)--有关进程间合伙时操作旳时间顺序旳限制。
互斥和同步旳区别:一种只要不同步发生就行,谁先谁后看排队、优先级;一种是动作要有严格旳时间顺序。
下面我们先讨论互斥旳问题2.2.2 临界区(Critical Section)我们把一次仅容许一种进程使用旳资源称为临界资源(Critical Resource)。
如打印机,绘图仪,磁带机等,公共变量,公用表格,公用队列等。
访问临界资源旳那段程序称为临界区。
它可以从概念上分离出来,而,或叫临界段(互斥段)。
例1:有两个进程共享一种变量count。
P1:R1:=COUNT;ﻩﻩ|R1:=R1+1;ﻩﻩ |COUNT:=R1;ﻩ|P2:R2:=COUNT;ﻩﻩﻩ|R2:=R2+1; ﻩ|COUNT:=R2;ﻩﻩ此时两个进程各自对count作了加操作,而count增长了2。
如果执行是另一种顺序。
P1:R1:=COUNT;ﻩ|发生时钟中断P2:R2:=COUNT;ﻩ|P2:R2:=R2+1;ﻩﻩﻩ|ﻩ|COUNT:=R2;ﻩ……ﻩﻩﻩﻩ|P1:R1:=R1+1;ﻩﻩ|COUNT:=R1;ﻩﻩ虽然两个进程也各自对count作了加一操作,但count却只增长了一。
例2:两个进程在系统中共用一种缓冲队列。
如果程序顺序是p1:return ptr1:=ptr;ﻩ获得第一种缓冲区旳PTRﻩptr:=tail(ptr);ﻩ指针指向下一种p2:reture ptr2:=ptr;获得第二个缓冲区旳PTR ptr:=tail(ptr); 指针指向第三个但如果程序顺序是:p1:return ptr1:=ptr;ﻩﻩ获得第一种缓冲区旳PTR 发生时钟中断:p2:retureptr2:=ptr;ﻩﻩ也获得第一种缓冲区旳PTRp1:ptr:=tail(ptr);指针指向第二个PTRp2:ptr:=tail(ptr); ﻩ指针指向第三个PTR执行成果导致p1,p2共得一种缓冲区,第二个缓冲区丢失,第三个缓冲区成为首部。
技工院--苹果-桔子问题的实现

《操作系统》课程设计任务书题目:苹果-桔子问题的实现学生姓名:班级:物联网工程1班学号:指导教师:张清/贾娟娟一、设计目的学生通过该题目的设计过程,掌握进程同步问题的原理、软件开发方法并提高解决实际问题的能力。
二、设计内容1、了解UNIX的命令及使用格式,熟悉UNIX/LINUX的常用基本命令,练习并掌握UNIX提供的vi编辑器来编译C程序,学会利用gcc、gdb编译、调试C程序。
2、编写程序实现苹果-桔子问题。
桌上有一个空盘子,只允许放一个水果。
爸爸专向盘中放苹果,妈妈专向盘中放桔子,儿子专等吃盘中的桔子,女儿专等吃盘中的苹果。
规定当盘空时,一次只能放一个水果。
三、设计要求及工作量1、分析设计要求,给出解决方案(要说明设计实现所用的原理、采用的数据结构)。
2、设计合适的测试用例,对得到的运行结果要有分析。
3、设计中遇到的问题,设计的心得体会。
4、文档:课程设计打印文档每个学生一份,并装在统一的资料袋中。
5、光盘:每个学生的文档和程序资料建在一个以自己学号和姓名命名的文件夹下,刻录一张光盘,装入资料袋中。
四、要提交的成果1. 设计说明书一份,内容包括:1) 中文摘要100字;关键词3-5个;2) 设计思想;3)各模块的伪码算法;4)函数的调用关系图;5)测试结果;6)源程序(带注释);7)设计总结;8) 参考文献、致谢等。
2. 刻制光盘一张。
五、设计进度计划及时间安排六、主要参考资料1.汤子瀛,哲凤屏.《计算机操作系统》.西安电子科技大学学出版社.2.王清,李光明.《计算机操作系统》.冶金工业出版社.3.孙钟秀等. 操作系统教程. 高等教育出版社4.曾明. Linux操作系统应用教程. 陕西科学技术出版社.5. 张丽芬,刘利雄.《操作系统实验教程》. 清华大学出版社.6. 孟静,操作系统教程--原理和实例分析. 高等教育出版社7. 周长林,计算机操作系统教程. 高等教育出版社8. 张尧学,计算机操作系统教程,清华大学出版社9.任满杰,操作系统原理实用教程,电子工业出版社10.张坤.操作系统实验教程,清华大学出版社目录1.绪论 (1)1.1设计任务 (1)1.2设计思想 (1)1.3基础知识 (1)2.各模块伪码算法 (3)2.1父亲进程模块 (3)2.2母亲进程模块 (5)2.3儿子进程模块 (7)2.4女儿进程模块 (9)2.5Print函数 (11)3. 函数调用关系图 (14)3.1函数调用图........................................ 错误!未定义书签。
进程同步典型例题(操作系统)

进程同步练习题1.在公共汽车上,司机和售票员的工作流程如图所示。
为保证乘客的安全,司机和售票员应密切配合协调工作。
请用信号量来实现司机与售票员之间的同步。
司机售票员图司机和售票员工作流程图2.桌子上有一只盘子,盘子中只能放一只水果。
爸爸专向盘子中放苹果,妈妈专向盘子中放橘子,一个儿子专等吃盘子中的橘子,一个女儿专等吃盘子中的苹果。
用PV操作实现他们之间的同步机制。
3.a,b两点之间是一段东西向的单行车道,现要设计一个自动管理系统,管理规则如下:(1)当ab之间有车辆在行驶时同方向的车可以同时驶入ab段,但另一方向的车必须在ab 段外等待;(2)当ab之间无车辆在行驶时,到达a点(或b点)的车辆可以进入ab段,但不能从a 点和b点同时驶入;(3)当某方向在ab段行驶的车辆驶出了ab段且暂无车辆进入ab段时,应让另一方向等待的车辆进入ab段行驶。
请用信号量为工具,对ab段实现正确管理以保证行驶安全。
4.将只读数据的进程称为“读者”进程,而写或修改数据的进程称为“写者”进程。
允许多个“读者”同时读数据,但不允许“写者”与其他“读者”或“写者”同时访问数据。
另外,要保证:一旦有“写者”等待时,新到达的“读者”必须等待,直到该“写者”完成数据访问为止。
试用P、V操作正确实现“读者”与“写者”的同步。
(第二类读者写者问题,信号量解决方法)5.一条河上架设了由若干个桥墩组成的一座桥。
若一个桥墩只能站一个人,过河的人只能沿着桥向前走而不能向后退。
过河时,只要对岸无人过,就可以过。
但不允许河对岸的两个人同时过,以防止出现死锁。
请给出两个方向的人顺利过河的同步算法。
6.有一个仓库,可以存放A和B两种产品,但要求:(1)每次只能存入一种产品(A或B);(2)-N<A产品数量-B产品数量<M。
其中,N和M是正整数。
试用同步算法描述产品A与产品B的入库过程。
1、在公共汽车上,司机和售票员的工作流程如图所示。
为保证乘客的安全,司机和售票员应密切配合协调工作。
进程同步模拟设计--吃水果问题

附件1:学号:012课程设计题目进程同步模拟设计--吃水果问题学院计算机科学与技术学院专业计算机科学与技术专业班级计算机姓名指导教师2011 年01 月19 日课程设计任务书学生:专业班级:指导教师:作单位:计算机科学与技术学院题目: 进程同步模拟设计——吃水果问题初始条件:1.预备容:阅读操作系统的进程管理章节容,对进程的同步和互斥,以及信号量机制度有深入的理解。
2.实践准备:掌握一种计算机高级语言的使用。
要求完成的主要任务:(包括课程设计工作量及其技术要求,以及说明书撰写等具体要求)1.模拟吃水果的同步模型:桌子上有一只盘子,最多可容纳两个水果,每次只能放入或者取出一个水果。
爸爸专门向盘子中放苹果,妈妈专门向盘子中放橘子,两个儿子专门等待吃盘子中的橘子,两个女儿专门等吃盘子中的苹果。
2.设计报告容应说明:⑴需求分析;⑵功能设计(数据结构及模块说明);⑶开发平台及源程序的主要部分;⑷测试用例,运行结果与运行情况分析;⑸自我评价与总结:i)你认为你完成的设计哪些地方做得比较好或比较出色;ii)什么地方做得不太好,以后如何改正;iii)从本设计得到的收获(在编写,调试,执行过程中的经验和教训);iv)完成本题是否有其他方法(如果有,简要说明该方法);v)对实验题的评价和改进意见,请你推荐设计题目。
时间安排:设计安排一周:周1、周2:完成程序分析及设计。
周2、周3:完成程序调试及测试。
周4、周5:验收、撰写课程设计报告。
(注意事项:严禁抄袭,一旦发现,一律按0分记)指导教师签名:年月日系主任(或责任教师)签名:年月日进程同步模拟设计——吃水果问题1需求分析1.1吃水果问题的描述桌子上有一只盘子,最多可容纳两个水果,每次只能放入或者取出一个水果。
爸爸专门向盘子中放苹果,妈妈专门向盘子中放橘子,两个儿子专门等待吃盘子中的橘子,两个女儿专门等吃盘子中的苹果。
1.2问题的转换这是进程同步问题的模拟,可以把向盘子放或取水果的每一个过程可以转为一个进程的操作,这些进程是互斥的,同时也存在一定的同步关系。
操作系统中经典的水果问题

操作系统中经典的水果问题首先写下P、V操作实例分析Eg.1、桌上有一空盘,允许存放一只水果。
爸爸可向盘中存放苹果,也可向盘中存放桔子,儿子专等吃盘中的桔子,女儿专等吃盘中的苹果。
规定当盘空时一次只能放一只水果供吃者取用,请用P、V原语实现爸爸、儿子、女儿三个并发进程的同步。
答:根据题目知本题中需设置4个信号量,其中empty_number表示还可以向盘中放几个水果,其初值为1;;apple对应已放入盘中的苹果,orange 对应已放入盘中的桔子,它们的初值均为0; mutex 用来实现对盘子的互斥访问(包括放和取),其初值为1。
相应的进程可描述为:Eg.2、桌上有一个盘子,最多可以容纳两个水果,每次只能放入或取出一个水果。
爸爸专向盘子中放入苹果(apple) ,妈妈专向盘子中放入桔子(orange),两个儿子专等吃盘中的桔子,两个女儿专等吃盘子中的苹果。
请用P、V操作来实现爸爸、妈妈、儿子、女儿之间的同步互斥关系。
答:本题中需设置4个信号量,其中empty_number表示还可以向盘中放几个水果,其初值为2;apple对应已放入盘中的苹果,orange 对应已放入盘中的桔子,它们的初值均为0; mutex 用来实现对盘子的互斥访问(包括放和取),其初值为1。
相应的进程可描述为:Eg.3、桌上有一个盘子,可以存放一个水果,爸爸专向盘子中放入苹果,妈妈专向盘子中放入香蕉,一个儿子专等吃盘中的香蕉,一个女儿专等吃盘子中的苹果。
请用那P、V操作来实现爸爸、妈妈、儿子、女儿之间的同步互斥关系。
答:由题可知,盘子为互斥资源,因为可以放一个水果,所以empty_number初值为1;信号量mutex控制对盘子的互斥访问,初值为1;apple 和orange 分别表示盘中苹果和橘子的个数,初值为0。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
课程设计课程设计任务书学生姓名: Miss屠专业班级: 08计科指引教师:王海英工作单位:计算机科学与技术学院题目:进程同步模型系统设计——吃水果问题初始条件:1.预备内容:阅读操作系统进程管理章节内容,对进程同步和互斥,以及信号量机制度有进一步理解。
2.实践准备:掌握一种计算机高档语言使用。
规定完毕重要任务:(涉及课程设计工作量及其技术规定,以及阐明书撰写等详细规定)1.为下面吃水果问题创立进程并运用通信API实现进程之间同步模型。
可以解决如下情形:桌子上有一只盘子,最多可容纳两个水果,每次只能放入或者取出一种水果。
爸爸专门向盘子中放苹果,妈妈专门向盘子中放橘子,两个儿子专门等待吃盘子中橘子,两个女儿专门等吃盘子中苹果。
2.设计报告内容应阐明:⑴课程设计目与功能;⑵需求分析,数据构造或模块阐明(功能与框图);⑶源程序重要某些;⑷运营成果与运营状况分析;⑸自我评价与总结:i)你以为你完毕设计哪些地方做得比较好或比较出众;ii)什么地方做得不太好,后来如何改正;iii)从本设计得到收获(在编写,调试,执行过程中经验和教训);iv)完毕本题与否有其她其她办法(如果有,简要阐明该办法);时间安排:设计安排一周:周1、周2:完毕程序分析及设计。
周2、周3:完毕程序调试及测试。
周4、周5:撰写课程设计报告。
指引教师签名:年月日系主任(或责任教师)签名:年月日进程同步模型系统设计——吃水果问题1、课程设计目与功能1.1、目为下面吃水果问题创立进程并运用通信API实现进程之间同步模型。
可以解决如下情形:桌子上有一只盘子,最多可容纳两个水果,每次只能放入或者取出一种水果。
爸爸专门向盘子中放苹果,妈妈专门向盘子中放橘子,两个儿子专门等待吃盘子中橘子,两个女儿专门等吃盘子中苹果。
1.2、实现功能本程序共创立了4个在windows系统环境下实现线程,即Fahter、Mother、Son和Daughter等4个线程,以及putapple、putorange、getapple和getorange等4个函数,其中4个线程是用于实现爸爸、妈妈、儿子和女儿分别放水果和取水果线程操作,并分别调用这4个函数,来实现真正操作。
在本程序中还设立了mutex互斥信号、empty、apple和orange等信号量,用于各线程之间获取资源和放弃资源等线程之间操作控制,并且设立了盘子容量上线常量content。
其重要功能是用于实现爸爸和妈妈这2个互斥线程对于资源使用操作以及爸爸和女儿、妈妈和儿子这2组同步线程对于资源操作。
2、需求分析当计算机中两个或者各种进程在执行时需要使用公用缓冲区,并且对该缓冲区采用了互斥办法,这时如果并发执行这些进程时候就会导致CPU时间极大挥霍,这是操作系统设计规定不容许。
而这种现象在操作系统和顾客进程中大量存在。
因而为理解决这一问题,提出了同步概念,即把异部环境下一组并发进程,因直接制约而互相发送消息而进行互相合伙、互相等待,使得各进程按一定速度执行过程称为进程间同步。
在本系统中,爸爸与妈妈、儿子与女儿线程操作是互斥,但是爸爸与女儿、妈妈与儿子线程之间操作是同步。
因而要运用进程同步办法来实现这几者之间操作,固然其中也包括着互斥进程,由于盘子每次只能放入或者取出一种水果。
由于是在windows操作系统下实现,因此是采用线程办法实现。
3、整体功能及设计3.1数据构造设计在本次程序中一共涉及到线程、函数、互斥信号、信号量和常变量。
3.1.1线程线程是指进程内一种执行单元,也是进程内可调度实体。
单个进程在任何给定期刻,也许有不止一种线程在运营。
但进程启动同步启动了一种线程,该线程被称作主线程或执行线程。
一种进程除启动主线程外还可以启动各种线程,每个线程都共享进程地址空间,并且共享着进程地址空间及各种资源。
线程可以继续创立子线程。
如果主线程退出,主线程下所有子线程将失败。
线程创立格式如下:其中括号中则需要列出该函数各形参或者实参。
该函数返回值为线程句柄。
HANDLE CreateThread( );CreateThread函数参数阐明在本程序中使用了Father、Mother、Son和Daughter等共4个线程。
Father、Mother线程作用是模仿实现向盘子中放苹果或者橘子操作,当主程序执行之后创立了Father或者Mother线程,则该线程会独自占用整个资源,并执行putapple或者putorange函数来实现操作,在执行Father或者Mother线程时,一方面会将信号量empty减1,来阐明盘子中已经放置了一种水果,之后将互斥信号mutex置0,来阐明盘子已经被占用,其她进程无法占用。
当实现了putapple 或者putorange后,该线程会置mutex为1,来释放资源,表白该资源可以被其她线程所使用。
接下来将apple或者orange信号进行相应设立,表白在盘子中已经放置了苹果或者橘子,Daughter或者Son线程可以从盘子中取苹果或者橘子了。
Daughter 、Son线程作用是模仿实现从盘子中取出苹果或者橘子操作,当主程序中执行过Father或者Mother线程之后会释放资源,这时候Daughter或者Son 线程便得到了资源,在得到资源即盘子后会一方面将apple或者orange信号量进行设立,恢复本来数值以表白盘子中水果状况,并且将mutex互斥信号进行设立,表达资源正在被占用。
在实现了getapple或者getorange后,便对mutex互斥信号进行设立,以释放资源。
3.1.2函数若干个函数构成一种程序文献,若干个程序文献构成一种完整程序,因而函数是程序基本构成某些。
在本程序中共创立了putapple( )、putorange( )、getapple( )和getorange( )等4个功能函数,分别用来模仿实现放苹果、放橘子、取苹果和取橘子操作。
主函数main( )重要作用就是为Father、Mother、Son和Daughter 这四个线程服务,创立这几种线程,并在这些线程执行完毕后销毁它们。
主函数中Sleep( )函数,控制主线程休眠一段时间,并在此期间执行其她其她子线程,在休眠时间过后主线程执行完,整个程序执行完毕。
3.1.3互斥信号和信号量线程同步办法有诸多,最惯用有互斥(CMutex)、临界(CriticalSection)、信号量(Semaphore)和事件(Event)。
但本程序只用到了互斥和信号量。
其中mutex 是各线程之间互斥信号,当一种线程占用了资源之后,其她线程在没接受到告知时候即互斥信号为0时便无法使用资源。
empty、apple和orange为3个信号量,分别来表达资源使用状态,各线程依照这3个信号量来理解资源状态和使用资源。
这3个信号量变化范畴为0~ content,content为盘子容量,也是资源容量。
3.2程序实现框图3.2.1 main函数3.2.2 Father、Mother线程3.2.3 Son、Daughter线程4、编程实现4.1各线程声明:DWORD WINAPI Father(LPVOID lpParameter);//Father线程DWORD WINAPI Mother(LPVOID lpParameter);//Mother线程DWORD WINAPI Son(LPVOID lpParameter);//Son线程DWORD WINAPI Daughter(LPVOID lpParameter);//Daughter线程4.2 各信号量、互斥信号和常变量HANDLE mutex;//互斥信号mutexHANDLE empty;//信号量emptyHANDLE apple;//信号量appleHANDLE orange;//信号量orangeconst int content=2;//常变量mutex4.3个函数声明void putapple( );void putorange( );void getapple( );void getorange( );4.4主函数程序代码{mutex=CreateMutex(NULL,FALSE,NULL);//创立mutexempty=CreateSemaphore(NULL,content,content,NULL);//创立emptyapple=CreateSemaphore(NULL,0,content,NULL);//创立appleorange=CreateSemaphore(NULL,0,content,NULL);//创立oarngeHANDLE hThread1;HANDLE hThread2;HANDLE hThread3;HANDLE hThread4;hThread1=CreateThread(NULL,0,Father,NULL,0,NULL);//创立Father线程hThread2=CreateThread(NULL,0,Mother,NULL,0,NULL);//创立Mother线程hThread3=CreateThread(NULL,0,Son,NULL,0,NULL);//创立Son线程hThread4=CreateThread(NULL,0,Daughter,NULL,0,NULL);//创立Daughter线程CloseHandle(hThread1);//销毁Father线程CloseHandle(hThread2);//销毁Mother线程CloseHandle(hThread3);//销毁Son线程CloseHandle(hThread4);//销毁Daughter线程Sleep(35000);//主程序将在30秒后结束}4.5各线程程序代码DWORD WINAPI Father(LPVOID lpParameter)//Father线程实现{{WaitForSingleObject(empty,INFINITE);WaitForSingleObject(mutex,INFINITE);putapple( );Sleep(1500);ReleaseMutex(mutex);ReleaseSemaphore(apple,1,NULL);}}DWORD WINAPI Mother(LPVOID lpParameter)//Mother线程实现{while(1){WaitForSingleObject(empty,INFINITE);WaitForSingleObject(mutex,INFINITE);putorange( );Sleep(1500);ReleaseMutex(mutex);ReleaseSemaphore(orange,1,NULL);}}DWORD WINAPI Son(LPVOID lpParameter)//Son线程实现{while(1){WaitForSingleObject(orange,INFINITE);WaitForSingleObject(mutex,INFINITE);getorange( );Sleep(1500);ReleaseMutex(mutex);ReleaseSemaphore(empty,1,NULL);}}DWORD WINAPI Daughter(LPVOID lpParameter)//Daughter线程实现{while(1){WaitForSingleObject(apple,INFINITE);WaitForSingleObject(mutex,INFINITE);getapple( );Sleep(1500);ReleaseMutex(mutex);ReleaseSemaphore(empty,1,NULL);}}4.6各函数程序代码void putapple( )//Father放苹果{cout<<"爸爸要放苹果了!"<<endl;Sleep(1500);cout<<"苹果已经被放进去了!"<<endl; }void putorange( )//Mother放橘子{cout<<"妈妈要放橘子了!"<<endl;Sleep(1500);cout<<"橘子已经被放进去了!"<<endl; }void getapple( )//Daughter取苹果{cout<<"女儿要吃苹果了!"<<endl;Sleep(1500);cout<<"苹果已经被拿出来了!"<<endl; }void getorange( )//Son取橘子{cout<<"儿子要吃橘子了!"<<endl;Sleep(1500);cout<<"橘子已经被拿出来了!"<<endl;}5、运营成果与运营状况分析程序运营成果如下:各线程执行完一次成果:由于是设定了Sleep( )函数,因此程序在执行了35000毫秒,即35秒之后便自动结束。