二、吃水果综合设计

桌子上有一只盘子,最多可容纳两个水果,每次只能放入或取出一个水果。爸爸专向盘子放苹果(apple),妈妈专向盘子中放桔子(orange);两个儿子专等吃盘子中的桔子,两个女儿专等吃盘子中的苹果。请用P、V操作来实现爸爸、妈妈、儿子、女儿之间的同步与互斥关系。

【设计要求】
了解信号量机制,了解并掌握进程同步和互斥机制,熟悉信号量的操作函数,利用信号量实现对共享资源的控制。编程模拟实现这一问题的程序控制,分析处理过程。

1. 1.pv操作代码

semaphore empty=2,mutex=1,apple=0,orange=0; void father(){do{P(empty);    //等待盘子为空P(metux);    //等待获取对盘子的操作爸爸向盘中放一个苹果;V(mutex);   //释放对盘子的操作V(apple);   //通知女儿可以来盘子中取苹果}while(TRUE);
}void mather(){            do{P(empty);     //等待盘子为空P(metux);       //等待获取对盘子的操作妈妈向盘中放一个桔子;V(mutex);        //释放对盘子的操作V(orange);        //通知儿子可以来盘子中取橘子}while(TRUE);
}void son1(){                        do{P(orange);       //判断盘子中是否有桔子P(metux);        //等待获取对盘子的操作儿子1取出盘中的桔子;V(mutex);      //释放对盘子的操作V(empty);      //盘子空了,可以继续放水果了}while(TRUE);
}
void son2(){                        do{P(orange);       //判断盘子中是否有桔子P(metux);        //等待获取对盘子的操作儿子2取出盘中的桔子;V(mutex);      //释放对盘子的操作V(empty);      //盘子空了,可以继续放水果了}while(TRUE);
}void daugther1(){ do{P(apple);       //判断盘子中是否有苹果P(metux);        //等待获取对盘子的操作女儿1取出盘中的苹果;V(mutex);      //释放对盘子的操作V(empty);      //盘子空了,可以继续放水果了}while(TRUE);
}
void daugther2(){ do{P(apple);       //判断盘子中是否有苹果P(metux);        //等待获取对盘子的操作女儿2取出盘中的苹果;V(mutex);      //释放对盘子的操作V(empty);      //盘子空了,可以继续放水果了}while(TRUE);
}void main() {                 //四个并发进程的同步执行cobeginfather(); mather();  son();son();daugther();daugther();coend
}

2.c++程序代码

#include <stdio.h>
#include <stdlib.h>#include <semaphore.h>
#include <errno.h>#include <unistd.h>
#define total 2sem_t remain, apple, orange, mutex;
static unsigned int vremain = 2, vapple = 0, vorange = 0;void *father(void *);
void *mather(void *);
void *son1(void *);
void *son2(void *);
void *daughter1(void *);
void *daughter2(void *);
void print_sem();int main() {pthread_t fa, ma, so ,da;sem_init(&remain, 0, total);//总数初始化为2sem_init(&apple, 0, 0);//盆子中苹果数, 开始为0sem_init(&orange, 0, 0);//盆子中梨子数, 开始为0sem_init(&mutex, 0, 1);//互斥锁, 初始为1pthread_create(&fa, NULL, &father, NULL);pthread_create(&ma, NULL, &mather, NULL);pthread_create(&so, NULL, &son1, NULL);pthread_create(&da, NULL, &daughter1, NULL);pthread_create(&so, NULL, &son2, NULL);pthread_create(&da, NULL, &daughter2, NULL);for(;;);
}void *father(void *arg) {while(1) {sem_wait(&remain);sem_wait(&mutex);vremain--;vapple++;printf("父亲放苹果, 剩余空间=%u, 苹果数=%u\n", vremain, vapple);sem_post(&mutex);sem_post(&apple);sleep(1);}
}void *mather(void *arg) {while(1) {sem_wait(&remain);sem_wait(&mutex);vremain--; vorange++;printf("母亲放橘子, 剩余空间=%u, 橘子数=%u\n", vremain, vorange);sem_post(&mutex);sem_post(&orange);sleep(2);}
}void *son1(void *arg) {while(1) {sem_wait(&orange);sem_wait(&mutex);               vremain++; vorange--;printf("儿子吃橘子, 剩余空间=%u, 橘子数=%u\n", vremain, vorange);sem_post(&mutex);sem_post(&remain);sleep(3);}
}void *son2(void *arg) {while(1) {sem_wait(&orange);sem_wait(&mutex);
vremain++; vorange--;printf("儿子2吃橘子, 剩余空间=%u, 橘子数=%u\n", vremain, vorange);sem_post(&mutex);sem_post(&remain);sleep(3);}
}
void *daughter1(void *arg) {while(1) {sem_wait(&apple);sem_wait(&mutex);vremain++; vapple--;printf("女儿1吃苹果, 剩余空间=%u, 苹果数=%u\n", vremain, vapple);sem_post(&mutex);sem_post(&remain);sleep(3);}
}void *daughter2(void *arg) {while(1) {sem_wait(&apple);sem_wait(&mutex);
vremain++; vapple--;printf("女儿2吃苹果, 剩余空间=%u, 苹果数=%u\n", vremain, vapple);sem_post(&mutex);sem_post(&remain);sleep(3);}
}void print_sem() {int val1, val2, val3;sem_getvalue(&remain, &val1);sem_getvalue(&apple, &val2);sem_getvalue(&orange, &val3);printf("Semaphore: remain:%d, apple:%d, orange:%d\n", val1, val2, val3);
}

3.程序模拟实现截图

第一次模拟实验截图

第二次模拟实验截图

P、V操作与c++代码实现爸爸放苹果,妈妈放桔子,两个儿子专吃盘子中桔子,两个女儿专吃盘子中苹果问题相关推荐

  1. 操作系统经典问题之爸爸放苹果妈妈放橘子儿子吃橘子女儿吃苹果问题

    一.爸爸放苹果妈妈放橘子儿子橘子女儿吃苹果问题 现在有一个盘子,爸爸向这个盘子里放苹果,妈妈向这个盘子里放橘子.儿子只从这个盘子里拿妈妈放置的橘子吃,而女儿从这个盘子里拿爸爸放的苹果吃.这是由生产者- ...

  2. vp操作 信号量_信号量P,V操作

    2013-07-22 20:20:30 信号量是最早出现的用来解决进程同步与互斥问题的机制(也可实现进程通信),包括一个称为信 号量的变量及对它进行的两个原语操作.信号量为一个整数,我们设这个信号量为 ...

  3. 操作系统信号量与P、V操作 初步认识整理

    初步接触,若有不足之处,请各位不吝赐教.谢谢! 首先介绍:信号量 信号量包括整型信号量.结构型信号量.二值信号量. ① 整型信号量 最初,将信号量定义为一个共享的整型量,它保存可供使用的唤醒数目.如果 ...

  4. 一个海底隧道中只有一个车道,规定同一个方向的可以连续过隧道。某方向有列车过隧道时,另一个方向的列车就要等待, 现在东岸和西岸都有列车要过隧道,如果把每个过隧道的列车看作一个进程,使用P、V操作

    海底隧道问题 一个海底隧道中只有一个车道,规定同一个方向的可以连续过隧道.某方向有列车过隧道时,另一个方向的列车就要等待, 现在东岸和西岸都有列车要过隧道,如果把每个过隧道的列车看作一个进程,为保证安 ...

  5. v操作就是计算机结构中的什么作用,PV操作

    PV操作是一种实现进程互斥与同步的有效方法.PV操作与信号量的处理相关,P表示通过的意思,V表示释放的意思. PV操作是典型的同步机制之一.用一个信号量与一个消息联系起来,当信号量的值为0时,表示期望 ...

  6. 【操作系统】编程实现如下互斥同步问题:桌上有一空盘,爸爸可向盘中放苹果,也可向盘中放桔子,儿子专等吃盘中的桔子,女儿专等吃盘中的苹果。请用P、V原语(wait和signal操作)实现爸爸、儿子、女儿三

    题目 编程实现如下互斥同步问题:桌上有一空盘,爸爸可向盘中放苹果,也可向盘中放桔子,儿子专等吃盘中的桔子,女儿专等吃盘中的苹果.请用P.V原语(wait和signal操作)实现爸爸.儿子.女儿三个并发 ...

  7. 桌上有一空盘,最多允许存放两只水果,爸爸只向盘中放一个苹果,妈妈只向盘中放一个桔子,两个儿子专等吃盘中的桔子,两个女儿专等吃苹果。用P、V操作实现爸爸、妈妈、儿子、女儿四个并发进程的同步。

    放水果问题 桌上有一空盘,最多允许存放两只水果每次只能放入或是取出一只放一个苹果,爸爸只向盘中放一个苹果,妈妈只向盘中放一个桔子,两个儿子专等吃盘中的桔子,两个女儿专等吃苹果.用P.V操作实现爸爸.妈 ...

  8. 桌上有一空盘,最多允许存放一个水果。爸爸可向盘中放一个苹果或放一个桔子,儿子专等吃盘中的桔子,女儿专等吃苹果。 试用P、V操作实现爸爸、儿子、女儿三个并发进程的同步。

    问题描述:桌上有一空盘,最多允许存放一个水果.爸爸可向盘中放一个苹果或放一个桔子,儿子专等吃盘中的桔子,女儿专等吃苹果. 试用P.V操作实现爸爸.儿子.女儿三个并发进程的同步. 问题分析及思路: 本题 ...

  9. c语言p,用C语言实现P、V操作

    该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 操作系统中关于信号量操作的代码示例(Linux+windows) 原文:操作系统中关于信号量操作的代码示例(Linux+windows) 有一个生产者进程 ...

最新文章

  1. 如何提高python的运行效率_几个提升Python运行效率的方法之间的对比
  2. Spring中获取bean
  3. One order time zone
  4. python如何不跳行打印_python怎么不换行打印
  5. 苹果ipa软件包破解笔记
  6. 曼彻斯特解密_【专利解密】捷通科技改良VLC芯片,照明通信两不误
  7. python 完全背包问题_动态规划——背包问题python实现(01背包、完全背包、多重背包)...
  8. 计算机网络—SR选择重传协议
  9. 查看系统端口是否被占用
  10. Pspice17.2安装教程
  11. Vmware15虚拟机安装win7镜像
  12. es文件浏览器开启ftp服务器,es文件浏览器访问ftp服务器
  13. [精简]托福核心词汇106
  14. CSU oj 1681 Adjoin(dfs求树上最长路径)(搜索)
  15. 凤凰os安装super su
  16. 百练 2755:神奇的口袋
  17. golang 使用ssl连接smtp发送邮件
  18. Pycharm关闭错误提示,关闭“This inspection detects shadowing names defined in outer scopes.”等
  19. 计算机系统如何重置,如何重置电脑系统?看这里1分钟教会你!
  20. ajax/jason

热门文章

  1. SAP和Oracle的ERP是怎样被替代的?
  2. 如何制定团队发展的目标计划?
  3. Mac版R语言(四):pacman包——在R语言工程中一次性下载安装、导入多个包的方法
  4. Linux Crontab 定时任务
  5. Fast R-CNN 论文翻译
  6. 在本地部署自己的漏洞文章武器库(详细步骤说明)
  7. 在WSL中启动Ubuntu 20.04时出现错误[出现错误 2147942402 (0x80070002) (启动“ubuntu2004.exe”时)]
  8. 携程网某ajax验证存在sql注入
  9. Asymmetric numeral systems 翻译
  10. 夺命雷公狗---javascript NO:20 面向对象历史起源