操作系统课程设计吃水果问题完整版
- 格式:doc
- 大小:348.00 KB
- 文档页数:20
目录1、需求分析 (1)2、概要设计 (1)2.1.用数组数据结构实现上述求解 (1)2.2.用链数据结构实现上述求解 (1)2.3 用栈数据结构实现求解 (1)2.4 用递归实现上述求解 (2)3、运行环境 (2)3.1 硬件环境 (2)3.2软件环境 (2)4、详细设计 (2)4.1系统流程图 (2)4.2用数组数据结构实现上述求解 (3)4.3用链数据结构实现上述求解 (4)4.4用栈数据结构实现求解 (5)4.5用递归实现上述求解 (6)5、调试分析 (7)6、运行结果 (7)课程设计总结 (8)参考文献 (9)附录: (9)1、需求分析1、猴子吃桃子问题有一群猴子摘了一堆桃子,他们每天都吃当前桃子的一半且再多吃一个,到了第10天就只余下一个桃子。
用多种方法实现求出原来这群猴子共摘了多少个桃子。
要求:1)采用数组数据结构实现上述求解2)采用链数据结构实现上述求解3)采用栈实现上述求解4)采用递归实现上述求解2、概要设计2.1.用数组数据结构实现上述求解在taozi函数中定义一个一维数组,分别存储每天的桃子个数,根据题目的内容找出各个数之间的关系,用数组元素表示出来,根据用户输入要计算哪一天的桃子,用for循环控制结束。
在main函数中让用户输入要计算的哪一天,调用taozi 函数,以便用户可查出任意一天的桃子个数,用switch语句判断用户要执行的功能,然后用while循环控制,直到用户输入0为止。
2.2.用链数据结构实现上述求解先写出预定义常量和类型,写出结点的类型定义,创建结点,初始化链表,定义变量并初始化,找出结点与其后继结点之间的联系,然后在主函数中控制。
2.3 用栈数据结构实现求解本部分包括预定义常量和类型,顺序栈的定义,InitStack函数,Push函数,和main函数,在InitStack函数构造一个空栈,在Push函数中调用该函数,并在其中编写控制栈顶指针和栈底指针移动的语句,找出指针所指向的数据之间的关系,在main函数中编写控制循环结束的语句,最后再用main函数去调用Push函数。
实习一进程同步
一、实习内容
模拟进程同步。
二、实习目的
本实习要求学生理解进程同步的概念和进程同步技术——信号量机制。
三、实习题目
编写一个程序,模拟“吃水果问题”。
问题描述:桌上有一个盘子,每次只能放一个水果,爸爸专向盘中放苹果,妈妈专向盘中放橘子,儿子专等吃盘里的橘子,女儿专等吃盘里的苹果。
只要盘子空,爸爸妈妈可向盘中放水果,仅当盘中有自己需要的水果时,儿子或女儿可从中取出,请用信号量及PV操作模拟四人的同步关系。
提示:
(1)信号量和P、V(semwait&semsignal)操作原语自己定义,在保证该对原语原有意义的基础上,也可添加新内容(模拟的需要,结合提示(5)思考);
(2)4人分别是4个进程,每个进程的程序可由一个函数模拟;
其中,
进程名——作为进程的标识,自己定义。
状态——有两种状态,“就绪”和“阻塞”,初始状态都为“就绪”,用“R”表示。
当一个进程阻塞后,它的状态为“阻塞”,用“B”表示。
(3)当前执行哪个进程可由随机函数决定,若该进程当前是阻塞的,则打印“该进程阻塞”提示;否则,执行该进程程序;
(4)取、放水果的操作可用打印语句的方式替代;
(5)当一个阻塞态进程被唤醒成为就绪态,然后,再次被选中执行时,应从P原语的下一个语句开始执行。
这该怎么控制?想办法解决(结合提示(1)思考)。
注意:
信号量的设置和初值;
程序应有提示,界面友好!
用循环队列存阻塞队列和就绪队列。
西华大学上机实践报告课程名称:Windows系统编程年级:2011上机实践成绩:指导教师:陈克力姓名:徐千上机实践名称:吃水果问题学号:312011*********上机实践日期:12_04上机实践编号:实验10组号:1上机实践时间:18:30--20:30一、目的1. 掌握多进程间消息通信方式;2. 掌握定时器应用,随即函数的应用;3. 提高项目系统分析与设计方法;二、内容与设计思想吃水果问题介绍:吃水果问题是操作系统中典型的进程间通信问题。
桌上有一个空盘,允许存放20个水果,父母可向盘内随机个数的水果,如果盘子放满了,则等待;孩子等着吃盘内的水果,如果盘子空了,则等着父母放水果。
设计三个基于对话框的进程分别模拟盘子、父母、孩子的行为。
可以实现:(1)盘子进程动态显示盘子里面的水果数量;(2)父母进程中点击开始按钮,每隔5 秒随机往盘子里面放不大于10 个水果;并显示真正放入的水果数;(3)孩子进程中点击开始按钮,每隔2 秒随机从盘子里面取不多于5 个水果;并显示真正取到的水果数量。
实验思想:1. 采用基于对话框的MFC 应用程序;2. 利用自定义消息来实现多个进程间通信:(1)父母放水果时发送一个自定义消息(WM_MSG1),通过消息参数WParam的值(如规定为100 表示放),lParam 的值表示具体放入的水果数量;(2)孩子取水果时发送一个自定义消息消息(WM_MSG2),通过消息参数WParam 的值(如规定为200 表示取),lParam 的值表示具体想取得的水果数量;(3)盘子进程随时响应父母进程或孩子进程的消息,并进行判断处理:父母放时要判断盘子是否满,并发送一条自定义消息(WM_MSG3)给父母表明实际放入的水果数;孩子取时要判断盘子是否为空,并发送一条自定义消息(WM_MSG4)给孩子表明实际取得的水果数;(4)父母或孩子把盘子返回的消息显示在各自的对话框中;3. 父母或孩子的行为可以用定时器消息来完成。
附件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问题的转换这是进程同步问题的模拟,可以把向盘子放或取水果的每一个过程可以转为一个进程的操作,这些进程是互斥的,同时也存在一定的同步关系。
课程设计课程设计任务书学生: 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个函数,来实现真正的操作。
数学与计算机学院课程设计说明书课程名称:课程代码: 6015059 题目: 年级/专业/班:学生姓名:学号: 312011********* 开始时间: 2014 年 5 月 14 日完成时间: 2014 年 5 月 28 日课程设计成绩:学习态度及平时成绩(20)技术水平与实际能力(20)完成情况(20)创新(5)说明书(计算书、图纸、分析报告)撰写质量(35)总分(100)指导教师签名:年月日目录1 需求分析 (3)2 概要设计 (3)3详细设计 (4)4调试分析 (11)5用户使用说明 (12)6测试结果 (12)7 结论 (14)致谢 (15)参考文献 (15)摘要本课程设计主要解决猴子吃桃子的问题。
一群猴子摘了一堆桃子,他们每天都吃当前桃子的一半且再多吃一个,到了第10天就只余下一个桃子。
用多种方法实现求出原来这群猴子共摘了多少个桃子。
在课程设计中,系统开发平台为Windows 2000,程序设计设计语言采用Visual C++,数据库采用MS SQL 2000,程序运行平台为Windows 98/2000/XP。
在整个程序中分别采用数组数据结构、链数据结构、递归等结构形式实现此问题的求解。
程序通过调试运行,初步实现了设计目标。
关键词:程序设计;C++;数组;链;递归;猴子吃桃引言在日常生活中经常遇到一些与数据计算有关的问题,许多与猴子吃桃问题类似的问题要求用计算机程序语言来解决,用这个程序算法可以解决一些类似问题,以便利于生活实际。
1 需求分析1.1任务与分析任务功能:有一群猴子摘了一堆桃子,他们每天都吃当前桃子的一半且再多吃一个,到了第10天就只余下一个桃子。
用多种方法实现求出原来这群猴子共摘了多少个桃子要求:采用数组数据结构实现上述求解采用链数据结构实现上述求解采用递归实现上述求解如果采用4种方法者,适当加分分析:这个课程设计分为三个部分,即分别用三种不同的方法解决猴子吃桃子问题。
《操作系统》课程设计任务书题目:苹果-桔子问题的实现学生姓名:班级:物联网工程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)了解多线程如何工作及其设计3)掌握多线程对应的API函数二.实验题目与要求:有父亲、儿子、女儿三人和一个盘子。
当盘子空时,父亲往盘中放水果(只有苹果和香蕉),每次随机放苹果或香蕉,儿子和女儿马上取该水果,但是儿子只从盘中拿苹果,女儿只从盘中拿香蕉。
请模拟这样的一个过程,其中父亲放水果20 次。
三.程序分析首先,父亲放一个苹果在盘,儿子马上取苹果这件事与父亲放一个香蕉,女儿马上取之这件事是互斥的。
即在程序中体现在:当父亲每次放水果之后马上唤醒儿子或女儿来取,当一个孩子还没有拿到水果之前,父亲不允许放水果,另外一个孩子也不许来破坏。
我们用“临界区”实现:父亲函数:……进入临界区放苹果或香蕉……儿子或女儿函数:……取苹果或香蕉退出临界区……另外,儿子和女儿在默默等待,只要父亲放了水果他们就拿。
程序中表现在:儿女见到盘子没有水果,就被阻塞,父亲每次放水果后唤醒阻塞的孩子函数。
我们分别用信息量Apple和Banana作为父亲唤醒儿女和儿女等待的途径。
四.程序实现(程序在Microsoft visual studio 8编译链接)#include<windows.h>#include<iostream>#include<stdlib.h>#include<time.h>using namespace std;CRITICAL_SECTION mmutex;//临界区互斥HANDLE Apple,Banana;int k = 0;//记录线程号DWORD WINAPI Son(LPVOID n)//儿子行为函数{int i = 1;HANDLE Apple;Apple = ::OpenSemaphore(MUTEX_ALL_ACCESS,false,(LPCWSTR)"apple");//打开一个命名为apple的信号量while(1){//Sleep(2000);::WaitForSingleObject(Apple,INFINITE);//等待父亲生产苹果cout<<"Son eats "<<i<<" apples"<<endl;LeaveCriticalSection(&mmutex);//离开临界区i++;}::CloseHandle(Apple);//退出线程return 0;}DWORD WINAPI Daughter(LPVOID n)//女儿行为函数{int i =1;HANDLE Banana;Banana = ::OpenSemaphore(MUTEX_ALL_ACCESS,false,(LPCWSTR)"banana");//打开一个命名为banana的信号量while(1){//Sleep(2000);::WaitForSingleObject(Banana,INFINITE);//等待父亲生产香蕉cout<<"Daughter eats "<<i<<" bananas"<<endl;LeaveCriticalSection(&mmutex);//离开临界区i++;}::CloseHandle(Banana);//退出线程return 0;}DWORD WINAPI Father(LPVOID n)//父亲行为函数{UINT fruit;EnterCriticalSection(&mmutex);//进入临界区//产生一个随机数srand(GetTickCount());fruit = rand()%2;if(fruit == 0){cout<<k+1<<" father produce an apple"<<endl;//放苹果::ReleaseSemaphore(Apple,1,NULL);//唤醒儿子吃苹果}else{cout<<k+1<<" father produce a banana"<<endl;//放香蕉::ReleaseSemaphore(Banana,1,NULL);//唤醒女儿吃香蕉}k = k+1;return 0;}int main(){Apple = ::CreateSemaphore(NULL,0,1,(LPCWSTR)"apple");//产生命名为apple的信号量Banana = ::CreateSemaphore(NULL,0,1,(LPCWSTR)"banana");//产生命名为banana的信号量InitializeCriticalSection(&mmutex);//给临界区初始化for (int j= 0 ; j < 20; j++){::CreateThread(NULL,0,Father,NULL,0,0);//创建父亲线程}::CreateThread(NULL,0,Son,NULL,0,0);//创建儿子线程::CreateThread(NULL,0,Daughter,NULL,0,0);//创建女儿线程Sleep(30000);//等待秒之后再结束main函数return 0;}五.程序结果六.实验心得1.在产生随机数的时候必须加上srand(GetTickCount())这个函数,否则每次系统都是产生同一个数,因此每次父亲总是生产苹果或者香蕉。
操作系统-吃水果问题操作系统-吃水果问题1、引言本文档描述了一个操作系统的模拟问题-吃水果问题。
该问题涉及到多个进程同时对有限数量的水果资源进行访问的情况。
我们将介绍该问题的背景、目标和关键概念。
2、背景吃水果问题模拟了现实生活中多个进程同时访问共享资源的情况。
在该问题中,不同的进程可以同时访问一定数量的水果资源。
然而,由于水果资源有限,进程必须遵守特定的规则以确保公平访问。
3、目标该问题的目标是设计一种算法,使得不同的进程能够共享有限的水果资源。
我们的目标是确保进程之间的公平访问,并通过合适的同步机制来避免产生竞争条件和死锁。
4、关键概念4.1 进程(Process)进程是计算机中正在运行的程序的实例。
在吃水果问题中,每个进程代表一个人,这些人需要同时访问共享的水果资源。
4.2 共享资源(Shared Resource)共享资源是多个进程可能同时访问的资源。
在吃水果问题中,水果资源是共享资源,被多个进程同时竞争。
4.3 同步机制(Synchronization Mechanism)同步机制用于控制多个进程对共享资源的访问。
在吃水果问题中,我们需要设计一种同步机制来确保进程之间的公平访问和避免竞争条件。
5、解决方案5.1 问题分析首先,我们需要确定问题的规模和要求。
包括进程数量、水果资源数量以及对公平访问的要求等。
5.2 同步机制设计我们可以采用多种同步机制来解决吃水果问题,例如互斥锁、条件变量等。
在设计同步机制时,需要考虑到公平性、死锁避免和性能等方面的因素。
5.3 算法实现根据设计的同步机制,我们需要实现相应的算法来解决吃水果问题。
这个算法应该能够正确地控制进程对资源的访问,并满足公平访问和避免死锁的要求。
6、测试与调试在实现算法之后,我们需要进行测试和调试来确保算法的正确性和性能。
包括编写测试用例、模拟并发情况和调整参数等。
7、结论通过本文档,我们介绍了操作系统中的吃水果问题,并提供了解决该问题的解决方案。
附件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问题的转换这是进程同步问题的模拟,可以把向盘子放或取水果的每一个过程可以转为一个进程的操作,这些进程是互斥的,同时也存在一定的同步关系。
C++11实现信号量(吃⽔果问题)c++11中有互斥和条件变量但是并没有信号量,但是利⽤互斥和条件变量很容易就能实现信号量。
1.信号量 信号量是⼀个整数 count,提供两个原⼦(atom,不可分割)操作:P 操作和 V 操作,或是说 wait 和 signal 操作。
P操作 (wait操作):count 减1;如果 count < 0 那么挂起执⾏线程;V操作 (signal操作):count 加1;如果 count <= 0 那么唤醒⼀个执⾏线程;2.信号量的实现 吃⽔果问题:桌⼦有⼀只盘⼦,只允许放⼀个⽔果,⽗亲专向盘⼦放苹果,母亲专向盘⼦放桔⼦⼉⼦专等吃盘⼦的桔⼦,⼥⼉专等吃盘⼦的苹果。
只要盘⼦为空,⽗亲或母亲就可以向盘⼦放⽔果,仅当盘⼦有⾃⼰需要的⽔果时,⼉⼦和⼥⼉可从盘⼦取出。
请给出四个⼈之间的同步关系,并⽤ pv操作实现四个⼈的正确活动的问题。
#include <iostream>#include <thread>#include <mutex>#include <condition_variable>using namespace std;class semaphore{public://初始化信号个数semaphore(int value = 1) :count(value) {}void P()//相当于信号P操作,申请⼀个信号{unique_lock<mutex> lck(mtk);if (--count < 0)//资源不⾜挂起线程cv.wait(lck);}void V()//相当于V操作,释放⼀个信号{unique_lock<mutex> lck(mtk);if (++count <= 0)//有线程挂起,唤醒⼀个cv.notify_one();}private:int count;mutex mtk;condition_variable cv;};//有苹果、橙⼦、盘⼦三种信号semaphore plate(1), apple(0), orange(0);void father(){while (true){//可⽤盘⼦减⼀plate.P();cout << "往盘中放⼀个苹果" << endl;//苹果加⼀apple.V();}}void mother(){while (true){//盘⼦减⼀plate.P();cout << "往盘中放⼀个橘⼦" << endl;//橙⼦加⼀orange.V();}}void son(){while (true){//苹果减⼀apple.P();cout << "⼉⼦吃苹果" << endl;//盘⼦加⼀plate.V();}}void daughter(){while (true){//橙⼦减⼀orange.P();cout << "⼥⼉吃橘⼦" << endl;//盘⼦加⼀plate.V();}}int main(){thread f(father), m(mother), s(son), d(daughter);f.join();m.join();s.join();d.join();system("pause");return0;}。
山西大学课程实验报告实验课程操作系统实验实验名称操作系统模拟程序设计(4)实验地点自动化与软件学院中心机房实验时间第七周第七节到第八节学生班级学生学号学生姓名指导教师2020 年 10 月 21 日实验题目:水果盘问题桌子上有一只盘子,只能容纳一个水果,每次只能放入或取出一个水果,爸爸专往盘子里放苹果。
妈妈专往盘子里放橘子,儿子专门等待吃盘子中的橘子,女儿专门等待吃盘子中的水果。
设计思路或流程图1.分析是否存在共享数据的问题?水果盘问题存在共享数据,在同一个时刻,只能有一个线程对水果盘中的水果进行操作,爸爸,妈妈放水果(爸爸放苹果,妈妈放橘子),儿子和女儿取水果(儿子取橘子,女儿取实验源程序加注释:package jihe;/*** @author moran* @create 2020-12-02-15:21*/import java.util.concurrent.locks.Condition;import java.util.concurrent.locks.Lock;import java.util.concurrent.locks.ReentrantLock;/*水果盘问题*/class Plant{private int apple=0;private int orange=0;private int fruit=0;Lock lock = new ReentrantLock(); // 锁对象Condition fmther_lock = lock.newCondition();// 爸妈监视器Condition son_lock = lock.newCondition(); // 儿子监视器Condition daughter_lock = lock.newCondition(); // 女儿监视器public void FatherProcess() {lock.lock();while(fruit==1) {// System.out.println("爸爸线程阻塞");try {fmther_lock.await();} catch (InterruptedException e) {e.printStackTrace();}}while(fruit==0){fruit++;apple++;System.out.println(Thread.currentThread().getName()+":放苹果...");// lock.unlock();daughter_lock.signal();//System.out.println("女儿线程被唤醒....");}lock.unlock();}public void MotherProcess() {lock.lock();while (fruit == 1) {//System.out.println("妈妈线程阻塞");try {fmther_lock.await();//System.out.println("妈妈线程阻塞");} catch (InterruptedException e) {e.printStackTrace();}}while (fruit == 0) {fruit++;orange++;System.out.println(Thread.currentThread().getName() + ":放桔子...");//lock.unlock();son_lock.signal();//System.out.println("儿子线程被唤醒....");}lock.unlock();}public void SonProcess () {lock.lock();while (orange == 0) {// System.out.println("儿子线程阻塞");try {son_lock.await();} catch (InterruptedException e) {e.printStackTrace();}}while (orange==1) {System.out.println(Thread.currentThread().getName() + ":取桔子...");fruit--;orange--;// lock.unlock();fmther_lock.signal();//System.out.println("爸爸妈妈线程被唤醒....");}lock.unlock();}//创建女儿线程public void DaughterProcess() {lock.lock();while (apple == 0) {//当盘中没有苹果// System.out.println("女儿线程阻塞");try {daughter_lock.await();//唤醒女儿监视器,女儿进程阻塞// System.out.println("女儿线程阻塞");} catch (InterruptedException e) {e.printStackTrace();}}//当盘中有苹果while (apple == 1) {System.out.println(Thread.currentThread().getName() + ":取苹果...");fruit--;apple--;fmther_lock.signal();//System.out.println("爸爸妈妈线程被唤醒....");}lock.unlock();}}//用继承Thread的方法处理多线程问题class Father extends Thread{private Plant plant;public Father(Plant plant){this.plant=plant;}@Overridepublic void run() {while(true){//System.out.println(getName()+":开始放苹果");plant.FatherProcess();//调用爸爸线程}}}class Mother extends Thread{private Plant plant;public Mother(Plant plant){this.plant=plant;}@Overridepublic void run() {while(true){System.out.println(getName()+":开始放桔子");plant.MotherProcess();//调用妈妈线程}}}class Son extends Thread{private Plant plant;public Son(Plant plant){this.plant=plant;}public void run() {while(true){System.out.println(getName()+":开始取桔子");plant.SonProcess();//调用儿子线程}}}class Daughter extends Thread{private Plant plant;public Daughter(Plant plant){this.plant=plant;}public void run() {while(true){System.out.println(getName()+":开始取苹果");plant.DaughterProcess();//调用女儿线程}}}public class FruitTest {public static void main(String[] args) {Plant p=new Plant();Father f=new Father(p);Mother m=new Mother(p);Son s=new Son(p);Daughter d=new Daughter(p);f.setName("爸爸");//给线程命名m.setName("妈妈");s.setName("儿子");d.setName("女儿");f.start();//调用start函数开启线程m.start();s.start();d.start();}实验测试结果记录:1.测试结果一2.测试结果二实验成果总结:1.实现了本实验所要求的基本功能。
操作系统课程设计吃水果问题完整版目录1 题目内容及要求 (2)1.1 题目名称 (2)1.2 题目描述 (2)1.3 解题思路 (2)1.4 程序清单 (6)1.5 提交结果框图 (16)2 总结 (20)3 参考文献 (20)1 题目内容及要求1.1题目名称进程同步模拟设计:吃水果问题1.2题目描述桌子上有一只盘子,最多可容纳两个水果,每次只能放入或者取出一个水果。
爸爸专门向盘子中放苹果,妈妈专门向盘子中放橘子,两个儿子专门等待吃盘子中的橘子,两个女儿专门等吃盘子中的苹果。
1.3解题思路将问题转换为信号量上的资源分配类型问题:这是进程同步问题的模拟,可以把向盘子放或取水果的每一个过程可以转为一个进程的操作,这些进程是互斥的,同时也存在一定的同步关系。
通过编程实践时,实际是随机的调用人一个进程的操作,而这些进程的操作相当于程序中的函数调用。
而计算机在执行时每一个时刻只能执行一个操作,这就默认了互斥。
同步的模拟可以类似于函数调用时的前提关系即先决条件。
这样进程同步模拟就完全可以通过函数的调用来实现。
具体的每一个操作的对应的函数的关系:爸爸向盘子中放一个苹果:Father()妈妈向盘子中放一个橘子:Mother()儿子1从盘子取一个橘子:Son1()儿子2从盘子取一个橘子:Son2()女儿1从盘子取一个苹果:Daugther1()儿子1从盘子取一个苹果:Daugther2()具体实现方案:(1)用一个整型变量Plate_Size表示盘子,初始值为0,当放水果时Plate_Size加1,取水果时Plate_Size减1。
变量Plate_Size的最大值为2,当为2时表示盘子已经满,此时若进行放水果操作,放水果将处于等待状态;为0时表示盘子为空,此时若进行取水果操作,取水果操作将处于等待状态。
(2)整型变量orange和apple分别表示盘子中的橘子和苹果数目,初始都为0,Plate_Size=apple+orange。
一、设计题目猴子吃桃子问题有一群猴子摘了一堆桃子,他们每天都吃当前桃子的一半且再多吃一个,到了第10天就只余下一个桃子。
用多种方法实现求出原来这群猴子共摘了多少个桃子。
二、运行环境(软、硬件环境)VC++6.0 PC电脑一台三、算法的需求分析1) 采用数组数据结构实现上述求解2) 采用链数据结构实现上述求解3) 采用递归实现上述求解4) 如果采用4种方法者,适当加分//用户界面int Desk(int n){printf("**************************************************\n");printf("| 欢迎进入猴子吃桃子系统|\n");printf("| 1-数组法2-链表法3-递归法4-二叉树法5-退出|\n");printf("***************************************************\n");printf("请输入要选择的方法: ");scanf("%d",&n);getchar();system("cls"); //刷新屏幕while(n<1 || n>5){printf("***输入错误! 请重新输入***\n");scanf("%d",&n);}return n;}四、算法概要设计//采用链数据结构 (栈) 实现上述求解typedef struct{int *top;int *base;}stack;//初始化一个栈stack Init(stack *s){s->base=(int *)malloc(STACK_SIZE*sizeof(int));if(s->base == NULL){printf("Init failed !\n");exit(-1);}s->top = s->base;return *s;}//二叉树创建一个大小为DAYS(由用给出)的二叉树,二叉树的左孩子节点存放当天的桃子数,右节点存放数字1,即为多吃的一个桃子。
操作系统中经典的水果问题首先写下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。
*******************实践教学*******************兰州理工大学计算机与通信学院2013年秋季学期操作系统原理课程设计题目:苹果—桔子问题的实现专业班级:姓名:学号:指导教师:成绩:摘要 (2)正文 (3)1.问题描述 (3)2.设计目的 (3)3.设计要求 (4)4.详细设计 (4)4.1界面设计 (4)4.2算法设计 (5)4.2.1数据结构 (5)4.2.2模块声明 (6)4.2.3算法设计 (6)4.3流程图 (8)5.结果分析 (12)设计总结 (16)参考文献 (17)致谢 (18)附录:源程序代码 (19)本设计实际是生产者—消费者的变形,是典型的进程同步问题。
本问题利用C语言实现相应的P、V原语。
主要过程可用生产消费者来模拟,这里,生产者(父亲和母亲)放入缓冲区(盘子)的产品有两类(苹果和桔子),消费者(女儿和儿子)也有两类,每类消费者只消费其中固定的一类产品。
生产者和消费者共享缓冲区,缓冲区中有空时,生产者可放入产品(不许放重),否则等待。
缓冲区中有产品时,消费者可取出产品(不许取重),否则等待。
关键字:进程同步,P、V操作,信号量1.问题描述桌上有一个空盘子,只允许放一个水果。
爸爸专向盘中放苹果,妈妈专向盘中放桔子,儿子专等吃盘中的桔子,女儿专等吃盘中的苹果。
规定当盘空时,一次只能放一个水果。
这个问题实际上是两个生产者和两个消费者被连接到仅能放一个产品的缓冲器上。
生产者各自生产不同的产品,但就其本质而言,他们是同一类生产者。
而消费者则各自去需要的产品消费,但消费的方式不同。
解决此类问题利用记录型信号量机制和P、V操作来实现进程同步。
进程同步是指一个进程的执行依赖于另一个进程的信号或消息,当一个进程没有得到来自与另一个进程的信号或消息时则等待,直到信号或消息到达才被唤醒。
2.设计目的本实验是典型的进程同步问题。
某些进程为了完成同一任务分工合作,由于合作的每一个进程都是独立的不可预知的推进,这就需要相互合作的进程在某些合作点上协调各自的工作。
操作系统课程设计报告院(系):计算机工程学院专业:计算机科学与技术专业学生姓名:__班级:__学号:题目:用多进程同步方法演示“桔子-苹果”问题____起迄日期:_2012.07.02_--2012.07.13_____设计地点:现代教育中心指导教师:熊晓芸2011—2012年度第 2 学期完成日期: 2012 年 7 月 13 日一、课程设计目的本次实验进行操作系统课程设计的主要任务是模拟生产者和消费者的一个衍生,即实现“橘子-苹果问题”。
这个问题中有两个生产者,分别生产苹果核橘子,有两个消费者,分别消费橘子和苹果。
同时,因为两个生产者和两个消费者对同一个缓冲区进行操作,所以应互斥的访问缓冲区以保证程序的正确性。
本次实验的目的就是加深各个进程正确有效的对资源的访问,即同步和互斥。
同时掌握信号量在互斥访问中的使用。
掌握生产者和消费者问题的流程和实现方法。
同时提高编程的能力、对问题的解决能力及查阅文档的能力。
二、课程设计内容与要求1、通过研究Linux的进程同步机制和信号量,实现特殊的生产者与消费者问题的并发控制。
2、说明:有两类生产者,一类负责生产桔子,一类负责生产苹果;有两类消费者,一类负责消费桔子,一类负责消费苹果;他们共享一个有20个存储单元的有界缓冲区,每个存储单元只能放入一种产品(桔子/苹果)。
3、设计要求:1)二类生产者与二类消费者数目均为20,即20个生产者负责生产桔子,20个生产者负责生产苹果;20个消费者负责消费桔子,20个消费者负责消费苹果2)二类生产者的生产速度与二类消费者的消费速度均可独立在程序界面调节,在运行中,该值调整后立即生效3)多个生产者或多个消费者之间必须有共享对缓冲区进行操作的函数代码,同时需要考虑算法的效率性4)每个生产者和消费者对有界缓冲区进行操作后,即时显示有界缓冲区的全部内容、当前生产者与消费者的指针位置,以及生产者和消费者线程标识符5)采用可视化界面,可在运行过程中随时暂停,查看当前生产者、消费者以及有界缓冲区的状态三、系统分析与设计1、系统分析1.此次任务是实现特殊生产者和消费者的演示程序,所需要处理的信息是生产者和消费者的个数,生产苹果、橘子和消费苹果、橘子的速度控制,缓冲区中橘子和苹果的个数和当前生产、消费指针的位置。
目录1 题目内容及要求 (2)1.1 题目名称 (2)1.2 题目描述 (2)1.3 解题思路 (2)1.4 程序清单 (6)1.5 提交结果框图 (16)2 总结 (20)3 参考文献 (20)1 题目内容及要求1.1题目名称进程同步模拟设计:吃水果问题1.2题目描述桌子上有一只盘子,最多可容纳两个水果,每次只能放入或者取出一个水果。
爸爸专门向盘子中放苹果,妈妈专门向盘子中放橘子,两个儿子专门等待吃盘子中的橘子,两个女儿专门等吃盘子中的苹果。
1.3解题思路将问题转换为信号量上的资源分配类型问题:这是进程同步问题的模拟,可以把向盘子放或取水果的每一个过程可以转为一个进程的操作,这些进程是互斥的,同时也存在一定的同步关系。
通过编程实践时,实际是随机的调用人一个进程的操作,而这些进程的操作相当于程序中的函数调用。
而计算机在执行时每一个时刻只能执行一个操作,这就默认了互斥。
同步的模拟可以类似于函数调用时的前提关系即先决条件。
这样进程同步模拟就完全可以通过函数的调用来实现。
具体的每一个操作的对应的函数的关系:爸爸向盘子中放一个苹果:Father()妈妈向盘子中放一个橘子:Mother()儿子1从盘子取一个橘子:Son1()儿子2从盘子取一个橘子:Son2()女儿1从盘子取一个苹果:Daugther1()儿子1从盘子取一个苹果:Daugther2()具体实现方案:(1)用一个整型变量Plate_Size表示盘子,初始值为0,当放水果时Plate_Size 加1,取水果时Plate_Size减1。
变量Plate_Size的最大值为2,当为2时表示盘子已经满,此时若进行放水果操作,放水果将处于等待状态;为0时表示盘子为空,此时若进行取水果操作,取水果操作将处于等待状态。
(2)整型变量orange和apple分别表示盘子中的橘子和苹果数目,初始都为0,Plate_Size=apple+orange。
(3)用6个bool型的变量Father_lag,Mother_lag,Son1_lag,Son2_lag,Daughter1_lag,Daughter2_lag表示六个进程是否处于等待状态。
处于等待时,变量值为true。
(4)两个放水果进程进程同时处于等待状态时,若有取水果的操作将自动执行等待的放水果进程,执行按等待的先后顺序;两个取苹果或橘子进程同时候处于等待状态,若有放苹果或橘子的操作将自动执行等待的取进程,进行按等待的先后顺序。
(5)用一个随机的函数产生0—5的6个整数,分别对应六个进程的调用。
放水果操作流程图设计(以Father为例,Mother类似):图1 Father放水果操作流程图取水果操作流程图设计(以Son为例,Daughter类似):图2 Son取水果(橘子)操作流程图1.4程序清单#include <iostream.h>#include <ctime>#include <cstdlib>#include <cmath>int apple=0;int orange=0;bool Father_lag;bool Mother_lag;bool Son1_lag;bool Son2_lag;int son_a;int Daughter_b;bool Daughter1_lag;bool Daughter2_lag;void Print(){cout<<" 现在盘子里有"<<apple<<"个苹果,"<<orange<<"个橘子,"<<"共有"<<apple+orange<<"个水果."<<endl;if(Father_lag==true)cout<<" Father进程处于等待状态,"<<endl;if(Mother_lag==true)cout<<" Mother进程处于等待状态,"<<endl;if(Son1_lag==true)cout<<" Son1进程处于等待状态,"<<endl;if(Son2_lag==true)cout<<" Son2进程处于等待状态, "<<endl;if(Daughter1_lag==true)cout<<" Daughter1进程处于等待状态,"<<endl;if(Daughter2_lag==true)cout<<" Daughter2进程处于等待状态,"<<endl;if(((Father_lag==false)&&(Mother_lag==false)&&(Son1_lag==false)&&(Son2_lag==false)&& (Daughter1_lag==false)&&(Daughter2_lag==false))!=true)cout<<endl;}void Father() //Father进程{apple++;Print();void Mother() //Mother进程{orange++;Print();}void Son1() //Son1进程{orange--;Print();}void Son2() //Son2进程{orange--;Print();}void Daughter1() //Daughter1进程{apple--;Print();}void Daughter2() //Daughter2进程{apple--;Print();}void main(){int i;int Plate_Size;//水果数量int MonFa_c;//用于爸爸妈妈等待次序的区别int Son_a;//用于两个儿子等待次序的区别int daughter_b;//用于两个女儿等待次序的区别int k;//产生进程调用的数量srand((unsigned)time(NULL));//srand()函数产生一个以当前时间开始的随机种子for(k=0;k<10;k++){cout<<endl;cout<<"***********************************"<<"第"<<k+1<<"次操作"<<"***********************************"<<endl;i=rand()%6; //随进生成1-5.Plate_Size=apple+orange;switch(i){case 0:cout<<" Father调用."<<endl;if(Plate_Size==2){Father_lag=true;//Father()等待Print();if(Mother_lag==false)MonFa_c=1;}else{Father();if((Daughter1_lag==true)&&(Daughter2_lag==true)){if(Daughter_b==1){Daughter1_lag=false;//Daughter1等待取消cout<<" 处于等待的Daughter1自动被调用"<<endl;Daughter1(); //处于等待的Daughter1自动调用Daughter_b=2;}else{Daughter2_lag=false;//Daughter2等待取消cout<<" 处于等待的Daughter2自动被调用"<<endl;Daughter2(); //处于等待的Daughter2()自动调用Daughter_b=1;}}else{if(Daughter1_lag==true){Daughter1_lag=false;//Daughter1等待取消cout<<" 处于等待的Daughter1自动被调用"<<endl;Daughter1(); //处于等待的Daughter1()自动调用Daughter_b=0;}else if(Daughter2_lag==true)Daughter2_lag=false;//Daughter2等待取消cout<<" 处于等待的Daughter1自动被调用"<<endl;Daughter2(); //处于等待的Daughter2()自动调用Daughter_b=0;}}}break;case 1:cout<<" Mother调用."<<endl;if(Plate_Size==2){Mother_lag=true; //等待Print();if(Father_lag==false)MonFa_c=2;}else{Mother();if((Son1_lag==true)&&(Son2_lag==true)){if(Son_a==1){Son1_lag=false;//Son1等待取消cout<<" 处于等待的Son1自动被调用"<<endl;Son1(); //处于等待的Son1()自动调用Son_a=2;}else{Son2_lag=false;//Son2等待取消cout<<" 处于等待的Son2自动被调用"<<endl;Son2(); //处于等待的Son2()自动调用Son_a=1;}}else{if(Son1_lag==true)Son1_lag=false; //Son1等待取消cout<<" 处于等待的Son1自动被调用"<<endl;Son1(); //处于等待的Son1()自动调用Son_a=0;}else if(Son2_lag==true){Son2_lag=false; //Son2等待取消cout<<" 处于等待的Son2自动被调用"<<endl;Son2(); //处于等待的Son2()自动调用Son_a=0;}}}break;case 2:cout<<" Son1调用."<<endl;if(orange==0){Son1_lag=true; //Son1处于等待Print();if(Son2_lag==false)Son_a=1; //用于判断Son1和Son2等待的先后性}else{Son1();if((Father_lag==true)&&(Mother_lag==true)){if(MonFa_c==1) //Father和Mother同时处于等待,但Father先等待,因此先调用{Father_lag=false;cout<<" 处于等待的Father自动被调用"<<endl;Father();MonFa_c=2;}else //Father和Mother同时处于等待,但Mother先等待,因此先调用{Mother_lag=false;cout<<" 处于等待的Mother自动被调用"<<endl;Mother();MonFa_c=1;}}else{if(Father_lag==true) //只有Father处于等待,调用{Father_lag=false;cout<<" 处于等待的Father自动被调用"<<endl;Father();MonFa_c=0;}else if(Mother_lag==true)//只有Mother处于等待,调用{Mother_lag=false;cout<<" 处于等待的Mother自动被调用"<<endl;Mother();MonFa_c=0;}}}break;case 3:cout<<" Son2调用."<<endl;if(orange==0){Son2_lag=true; //Son2处于等待Print();if(Son1_lag==false)Son_a=2;}else{Son2();if((Father_lag==true)&&(Mother_lag==true)){if(MonFa_c==1)//Father和Mother同时处于等待,但Father先等待,因此先调用{Father_lag=false;cout<<" 处于等待的Father自动被调用"<<endl;Father();MonFa_c=2;}else //Father和Mother同时处于等待,但Mother先等待,因此先调用{Mother_lag=false;cout<<" 处于等待的Mother自动被调用"<<endl;Mother();MonFa_c=1;}}else{if(Father_lag==true) //只有Father处于等待,调用{Father_lag=false;cout<<" 处于等待的Father自动被调用"<<endl;Father();MonFa_c=0;}else if(Mother_lag==true) //只有Mother处于等待,调用{Mother_lag=false;cout<<" 处于等待的Mother自动被调用"<<endl;Mother();MonFa_c=0;}}}break;case 4:cout<<" Daughter1调用."<<endl;if(apple==0){Daughter1_lag=true; //Daughter1等待Print();if(Daughter2_lag==false)Daughter_b=1;}else{Daughter1();if((Father_lag==true)&&(Mother_lag==true)){if(MonFa_c==1) //Father和Mother同时处于等待,但Father先{ //等待,因此先调用Father_lag=false;cout<<" 处于等待的Father自动被调用"<<endl;Father();MonFa_c=2;}else //Father和Mother同时处于等待,但Mother先等待,因此先调用{Mother_lag=false;cout<<" 处于等待的Mother自动被调用"<<endl;Mother();MonFa_c=1;}}else{if(Father_lag==true) //只有Father处于等待,调用{Father_lag=false;cout<<" 处于等待的Father自动被调用"<<endl;Father();MonFa_c=0;}else if(Mother_lag==true) //只有Mother处于等待,调用{Mother_lag=false;cout<<" 处于等待的Mother自动被调用"<<endl;Mother();MonFa_c=0;}}}break;case 5:cout<<" Daughter2调用."<<endl;if(apple==0){Daughter2_lag=true; //Daughter2等待Print();if(Daughter1_lag==false)Daughter_b=2;}else{Daughter2();if((Father_lag==true)&&(Mother_lag==true)){if(MonFa_c==1) //Father和Mother同时处于等待,但Father先等待,因此先调用{Father_lag=false;cout<<" 处于等待的Father自动被调用"<<endl;Father();MonFa_c=2;}else //Father和Mother同时处于等待,但Mother先等待,因此先调用{ Mother_lag=false;cout<<" 处于等待的Mother自动被调用"<<endl;Mother();MonFa_c=1;}}else{if(Father_lag==true) //只有Father处于等待,调用{ Father_lag=false;cout<<" 处于等待的Father自动被调用"<<endl;Father();MonFa_c=0;}else if(Mother_lag==true) //只有Mother处于等待,调用{ Mother_lag=false;cout<<" 处于等待的Mother自动被调用"<<endl;Mother();MonFa_c=0;}}}break;}}}1.5提交结果框图由于程序是模拟产生10次随机的操作,执行相应的函数来模拟进程同步。