进程同步模型系统的设计—吃水果
- 格式:doc
- 大小:104.50 KB
- 文档页数:15
操作系统课程设计—多进程同步橘子苹果问题源代码import ;import ;import ;import ;import ;import ;import java.awt.*;import ;import ;import ;import javax.swing.*;import ;public class Apple{/*** 生成一个缓冲池类对应的对象叫myStorage,以后所有的生产者线程和消费者线程都对这个myStorage对象进行操作!*/static MyStorage myStorage = new MyStorage();private JFrame window ;// 该数组用来存取生产橘子和苹果的线程,分别20个static Increaseapple[] appleincrease = new Increaseapple[20];static Increaseorange[] orangeincrease = new Increaseorange[20];// 该数组用来存放消费者线程,最多20个static Decreaseapple[] appledecrease = new Decreaseapple[20];static Decreaseorange[] orangedecrease = newDecreaseorange[20];// 代表两个生产者对应线程的数目,i1为苹果,i2为橘子static int i1 = 0;static int i2 = 0;// 代表消费者对应线程的数目,d1为苹果,d2为橘子static int d1 = 0;static int d2 = 0;static TextArea textArea1;static TextArea textArea2;static JProgressBar progressbar = new JProgressBar(0,20);static Draw draw1;static JTextField t1;static JTextField t2;static JTextField t3;static JTextField t4;public void createMainWindow(){window = new JFrame("橘子苹果问题");window.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);window.setSize(700,700);window.setResizable(false);JPanel panel = new JPanel();panel.setLayout(null);JLabel App1 = new JLabel("生产苹果者数:"); App1.setBounds(10, 500,100,25);panel.add(App1);progressbar.setStringPainted(true);progressbar.setBounds(200,640,300,30); panel.add(progressbar);progress p = new progress(myStorage);p.start();draw1 = new Draw(myStorage);draw1.setBounds(0,0,700,300);panel.add(draw1);t1 = new JTextField();t1.setBounds(120,500,60,25);t1.addKeyListener(new KeyAdapter(){public void keyTyped(KeyEvent event){char ch = event.getKeyChar();if (ch < '0' || ch > '9'){event.consume();}}});panel.add(t1);JButton inapp1 = new JButton("增加");inapp1.setBounds(190, 500, 60, 25);panel.add(inapp1);inapp1.addActionListener(new ActionListener() { @Overridepublic void actionPerformed(ActionEvent e) {if (i1 < 20){increaseappleProducer();t1.setText(String.valueOf(i1));}}});。
附件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问题的转换这是进程同步问题的模拟,可以把向盘子放或取水果的每一个过程可以转为一个进程的操作,这些进程是互斥的,同时也存在一定的同步关系。
《操作系统》课程设计任务书题目:苹果-桔子问题的实现学生姓名:班级:物联网工程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函数调用图........................................ 错误!未定义书签。
资料范本本资料为word版本,可以直接编辑和打印,感谢您的下载进程同步模型系统的设计—吃水果地点:__________________时间:__________________说明:本资料适用于约定双方经过谈判,协商而共同承认,共同遵守的责任与义务,仅供参考,文档可直接下载或修改,不需要的部分可直接删除,使用时请详细阅读内容课程设计课程设计任务书学生姓名: Miss屠专业班级: 08计科指导教师:王海英工作单位:计算机科学与技术学院题目: 进程同步模型系统的设计——吃水果问题初始条件:1.预备内容:阅读操作系统的进程管理章节内容,对进程的同步和互斥,以及信号量机制度有深入的理解。
2.实践准备:掌握一种计算机高级语言的使用。
要求完成的主要任务: (包括课程设计工作量及其技术要求,以及说明书撰写等具体要求)1.为下面吃水果的问题创建进程并利用通信API实现进程之间的同步模型。
能够处理以下的情形:桌子上有一只盘子,最多可容纳两个水果,每次只能放入或者取出一个水果。
爸爸专门向盘子中放苹果,妈妈专门向盘子中放橘子,两个儿子专门等待吃盘子中的橘子,两个女儿专门等吃盘子中的苹果。
2.设计报告内容应说明:⑴ 课程设计目的与功能;⑵ 需求分析,数据结构或模块说明(功能与框图);⑶ 源程序的主要部分;⑷ 运行结果与运行情况分析;⑸ 自我评价与总结:= 1 \* roman i )你认为你完成的设计哪些地方做得比较好或比较出色;= 2 \* roman ii )什么地方做得不太好,以后如何改正;= 3 \* roman iii )从本设计得到的收获(在编写,调试,执行过程中的经验和教训);= 4 \* roman iv )完成本题是否有其他的其他方法(如果有,简要说明该方法);时间安排:设计安排一周:周1、周2:完成程序分析及设计。
周2、周3:完成程序调试及测试。
周4、周5:撰写课程设计报告。
指导教师签名:年月日系主任(或责任教师)签名:年月日进程同步模型系统的设计——吃水果问题1、课程设计目的与功能1.1、目的为下面吃水果的问题创建进程并利用通信API实现进程之间的同步模型。
附件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;}。
操作系统中经典的水果问题首先写下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。
课程设计课程设计任务书学生: 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主函数的程序代码void main(){mutex=CreateMutex(NULL,FALSE,NULL);//创建mutexempty=CreateSemaphore(NULL,content,content,NULL); //创建empty apple=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线程实现{while(1){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秒之后便自动结束。