苹果-桔子问题是操作系统中P、V操作部分经典的问题,属于复杂一点的生产者-消费者问题,可以抽象的理解为两个生产者和两个消费者被连接到大小为1的缓冲区上。

#实现语言:C#
#问题描述
桌子上有一只盘子,每次只能向其中放入一个水果,要求:
1、爸爸专向盘子里放苹果,女儿专等吃盘子中的苹果;
2、妈妈专向盘子里放桔子,儿子专等吃盘子中的桔子;
3、只有盘子为空时,爸爸或妈妈就可向盘子中放入一个水果;
4、仅当盘子中有自己需要的水果时,儿子或女儿可以从盘子中取出。
#问题分析
首先4个进程对盘子的操作是互斥的,
而爸爸和女儿,妈妈和儿子之间又是同步关系,
所以需要设置两个同步信号量,一个互斥信号量;

using System;
using System.Threading;namespace ConsoleApp3
{class Program{// 定义三个信号量:apple,orange为同步信号量;planet为互斥信号量private static Semaphore apple, orange, planet;static void Main(string[] args){// 对信号量初始化apple = new Semaphore(0, 1);  // 盘子里没有苹果,同步信号量orange = new Semaphore(0, 1);  // 盘子里没有桔子,同步信号量planet = new Semaphore(1, 1);  // 互斥信号量,盘子里只允许放一个水果// 定义四个进程Thread Father = new Thread(father);Thread Mother = new Thread(mother);Thread Son = new Thread(son);Thread Daughter = new Thread(daughter);// 启动进程Father.Start();Mother.Start();Son.Start();Daughter.Start();}protected static void father(){while(true){planet.WaitOne();  // P(planet)Console.WriteLine("爸爸向盘子里放入一个苹果");Thread.Sleep(2000);apple.Release();  // V(apple)}}protected static void mother(){while (true){planet.WaitOne();  // P(planet)Console.WriteLine("妈妈向盘子里放一个桔子");Thread.Sleep(2000);orange.Release();  // V(orange)}}protected static void daughter(){while (true){apple.WaitOne();  // P(apple)Console.WriteLine("女儿从盘子里取出一个苹果");Thread.Sleep(2000);planet.Release();  // V(planet)Console.WriteLine("女儿吃掉苹果");}}protected static void son(){while (true){orange.WaitOne();  // P(orange)Console.WriteLine("儿子从盘子里取出一个桔子");Thread.Sleep(2000);planet.Release();  // V(planet)Console.WriteLine("儿子吃掉桔子");}}}
}

运行结果如下:

苹果-桔子问题(生产者-消费者问题)相关推荐

  1. 生产者消费者问题 操作系统

    2.15 生产者消费者问题 Dijkstra对同步问题的抽象 抽象解释 一个或多个生产者生产资源,放入临界区 一次仅有一个消费者访问临界区并消耗资源 每次仅有一名生产者/消费者访问临界区 临界区满时生 ...

  2. 生产者消费者模型(条件变量)

    三种关系:互斥,同步,互斥和同步 两类角色:生产者,消费者(线程) 一个交易场所:生产者消费者共享的区域 卖苹果的模型 dish上面只有一个苹果 买家必须要等卖家把苹果放到dish上才可以去买苹果. ...

  3. 操作系统——生产者-消费者问题

    一.简单生产者-消费者问题 问题描述:一组生产者进程和一组消费者进程共享一个初始为空.大小为 n 的缓冲区,只有缓冲区没满时,生产者才能把消息放入到缓冲区,否则必须等待:只有缓冲区不为空时,消费者才能 ...

  4. java多线程之生产者消费者问题

    今天研究了一下Java多线程,根据老师上课讲的和写的,自己写了一下多线程中的经典问题-----生产者消费者经典问题, package producerconsumer; public class Pr ...

  5. java 山洞过火车 java_Java多线程之生产者消费者模型

    [ 线程间的通讯 wait()在对象上等待,等待通知(在等待过程中释放对象锁.等待必须在同步块内.这个对象就是同步锁)<让线程进入阻塞状态,将线程放入等待池中> notify()通知在这个 ...

  6. 《操作系统》-生产者消费者问题

    什么是生产者消费者问题? 系统中有一组生产者进程和一组消费者进程.生产者进程每次生产一个产品放入缓冲区,消费者进程每次从缓冲区中取出一个进程并使用,那么他们之间具有这样一层关系 生产者.消费者共享一个 ...

  7. 生产者消费问题以及多生产者—消费者问题实现思想

    一.生产者消费问题 系统中有一组生产者进程和一组消费者进程,生产者进程每次生产一个产品放入缓冲区,消费者 进程每次从缓冲区中取出一个产品并使用.(注:这里的"产品"理解为某种数据) ...

  8. 【操作系统-进程】PV操作——生产者消费者问题

    文章目录 生产者消费者问题的万能方法步骤 Step 1. 有几类进程 Step 2. 用中文描述动作 Step 3. 添加 PV 操作,用中文描述里面的操作 Step 4. 检查是否出现死锁 Step ...

  9. 操作系统 | PV操作七大经典问题 生产者消费者 读者写者 哲学家进餐 理发师理发睡觉 和尚打水 吸烟者 吃水果

    一.生产者消费者问题 生产者消费者问题(英语:Producer-consumer problem),也称有限缓冲问题(英语:Bounded-buffer problem),是一个多线程同步问题的经典案 ...

最新文章

  1. 对象分割--Fully Convolutional Instance-aware Semantic Segmentation
  2. java maven centos7 yum安装
  3. python学习路线-2020年 Python学习路线及学习目标规划 拿走不谢!
  4. 顺序二叉树(基于数组存储树结点)
  5. 四十六、You-Get爬取B站热门排名的小视频
  6. [AaronYang]C#人爱学不学[1]
  7. 关于 try catch 捕捉不到异常
  8. python学习资源分享
  9. SQL server 2008 r2 安装出错 Could not open key:
  10. 基于HyperVID数据集训练自己的车型识别系统
  11. 理光2014ad扫描服务器响应,理光mp2014ad扫描驱动和打印驱动
  12. 【编程题】【Scratch二级】2021.06 绘制五彩缤纷的多瓣花
  13. 自动生成Makefile的全过程详解2
  14. 位置定位LocationManager
  15. 异步下载小说《诡秘之主》
  16. 鸿蒙灵根有哪些,关于神话中十大灵根,你知道的有我多吗?
  17. 用Python实现地理信息出图(含比例尺、指北针、图例)
  18. 互联神州CCSP冬季集训班信息
  19. 迅捷CAD编辑器如何将图片转换为CAD
  20. Android UI设计:Gallery

热门文章

  1. UG通讯类复杂薄壁产品工厂案例,00多张图档全是工厂实际加工案例整理归纳
  2. AUTOML学习神器VEGA(华为-诺亚方舟人工智能实验室出品)
  3. 华为手机显示服务器繁忙,手机服务器繁忙
  4. stm32毕设 stm32智能扫地机器人设计与实现
  5. 基于JAVAEE公共自行车租赁系统的设计与实现
  6. 在Origin里添加图例的方法
  7. 微信长按识别二维码 -- 页面多个二维码如何识别?
  8. 银行前置机或综合前置机ET是什么
  9. Flink-SQL源码解读(一)window算子的创建的源码分析
  10. 宽带由20M换为100M