进程同步模型系统的设计—吃水果
操作系统课程设计—多进程同步橘子苹果问题源代码

操作系统课程设计—多进程同步橘子苹果问题源代码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
1.1
进程同步模拟设计:吃水果问题
1.2
桌子上有一只盘子,最多可容纳两个水果,每次只能放入或者取出一个水果。爸爸专门向盘子中放苹果,妈妈专门向盘子中放橘子,两个儿子专门等待吃盘子中的橘子,两个女儿专门等吃盘子中的苹果。
1.3
将问题转换为信号量上的资源分配类型问题:
这是进程同步问题的模拟,可以把向盘子放或取水果的每一个过程可以转为一个进程的操作,这些进程是互斥的,同时也存在一定的同步关系。通过编程实践时,实际是随机的调用人一个进程的操作,而这些进程的操作相当于程序中的函数调用。而计算机在执行时每一个时刻只能执行一个操作,这就默认了互斥。同步的模拟可以类似于函数调用时的前提关系即先决条件。这样进程同步模拟就完全可以通过函数的调用来实现。
int MonFa_c;//用于爸爸妈妈等待次序的区别
int Son_a;//用于两个儿子等待次序的区别
int daughter_b;//用于两个女儿等待次序的区别
int k;//产生进程调用的数量
srand((unsigned)time(NULL));//srand()函数产生一个以当前时间开始的随机种子
Son2(); //处于等待的Son2()自动调用
Son_a=1;
}
}
else
{
if(Son1_lag==true)
{
Son1_lag=false; //Son1等待取消
cout<<"处于等待的Son1自动被调用"<<endl;
Son1(); //处于等待的Son源自()自动调用Son_a=0;
}
else if(Son2_lag==true)
{
orange--;
进程同步模拟设计--吃水果问题

附件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问题的转换这是进程同步问题的模拟,可以把向盘子放或取水果的每一个过程可以转为一个进程的操作,这些进程是互斥的,同时也存在一定的同步关系。
计算机操作系统进程同步算法习题选

s
t
解:
设置四个信号量Sin=1,Sout=0,Tin=1,Tout=0; get: while(1) { wait(Sin); 将数放入S; signal (Sout); } copy: while(1) { wait (Sout); wait (Tin); 将数从S取出放入T; signal (Tout); signal (Sin); } put: while(1) { wait (Tout); 将数从T取走; signal(Tin); }
A1: while (1) { wait(Sin[1]); wait(Sin[2]); 将数据放入缓冲区 signal(Sout[1]); signal(Sout[2]); }
Bi: while (1) { wait(Sout[i]); 从缓冲区取数 signal(Sin[i]); }
向目标前进一步:
司机进程: while(1) { 启动车辆
正常驾驶 到站停车 }…
售票 员 进程 : while(1) { 关门
售票
}…
开门
分析:
为保证车辆行驶安全,售票员必须关好车门, 然后通知司机启动车辆,在行驶过程中售票员不 能打开车门,待车到站停稳后,司机通知售票员 才能打开车门,如此不断重复。为此,须设置两 个信号量S1,S2用来控制司机和售票员的行为, 初值都为0。
解:
算法如下: 司机进程: while(1) { wait(S1) 启动车辆 正常驾驶 到站停车 signal(S2) }… 售票员进 程: while(1) { 关门 signal(S1)
售票
wait(S2) 开门 }…
【例题2】
1.用wait、signal操作解决下图之同步问题 提示:分别考虑对缓冲区S和T的同步,再 合并考虑 get copy put
技工院--苹果-桔子问题的实现

《操作系统》课程设计任务书题目:苹果-桔子问题的实现学生姓名:班级:物联网工程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实现进程之间的同步模型。
000操作系统课设报告(进程控制-吃苹果)

在计算机系统中每个进程都可产生某些资源或消耗一定的资源,当其产生资源的时候其就作为生产者,当其消耗资源的时候其就变为消费者。但是这些进程在执行的过程中只能互斥的访问临界区,否则就会产生一些错误。为了避免这种情况的发生,就必须引入一些信号量来控制程序有序的执行。
{
char *addr, end;
int shmid;
int semid_empty, semid_full1,semid_full2, semid_mutex;
struct sembuf sem_tmp;
/*开辟共享存储区*/
if ((shmid = shmget(SHMKEY, BUFF_LEN * PRODUCT_LEN+3, 0777|IPC_CREAT|IPC_EXCL)) == -1)
{
if (errno == EEXIST)
{
printf("The Buffer Has Existed!\n");
printf("Do You Want To Delete The Buffer(Y = yes)?\n====:");
scanf("%c", &end);
if(end == 'y' || end == 'Y')
小结:linux下的命令当然是非常多,以上列出的只是我在这次课程设计中所用到一些命令。此外,在我们在使用过程中遇到一些生僻的命令时,我们可以应用互联网来搜索相应的功能。在知道相关命令,但是忘记具体操作的时候我们还可以通过命令--help的方式来查看该命令的具体操作用法,非常实用。
进程同步模拟设计--吃水果问题

附件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、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 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主函数的程序代码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秒之后便自动结束。