苹果-桔子问题(生产者-消费者问题)
苹果-桔子问题是操作系统中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("儿子吃掉桔子");}}}
}
运行结果如下:
苹果-桔子问题(生产者-消费者问题)相关推荐
- 生产者消费者问题 操作系统
2.15 生产者消费者问题 Dijkstra对同步问题的抽象 抽象解释 一个或多个生产者生产资源,放入临界区 一次仅有一个消费者访问临界区并消耗资源 每次仅有一名生产者/消费者访问临界区 临界区满时生 ...
- 生产者消费者模型(条件变量)
三种关系:互斥,同步,互斥和同步 两类角色:生产者,消费者(线程) 一个交易场所:生产者消费者共享的区域 卖苹果的模型 dish上面只有一个苹果 买家必须要等卖家把苹果放到dish上才可以去买苹果. ...
- 操作系统——生产者-消费者问题
一.简单生产者-消费者问题 问题描述:一组生产者进程和一组消费者进程共享一个初始为空.大小为 n 的缓冲区,只有缓冲区没满时,生产者才能把消息放入到缓冲区,否则必须等待:只有缓冲区不为空时,消费者才能 ...
- java多线程之生产者消费者问题
今天研究了一下Java多线程,根据老师上课讲的和写的,自己写了一下多线程中的经典问题-----生产者消费者经典问题, package producerconsumer; public class Pr ...
- java 山洞过火车 java_Java多线程之生产者消费者模型
[ 线程间的通讯 wait()在对象上等待,等待通知(在等待过程中释放对象锁.等待必须在同步块内.这个对象就是同步锁)<让线程进入阻塞状态,将线程放入等待池中> notify()通知在这个 ...
- 《操作系统》-生产者消费者问题
什么是生产者消费者问题? 系统中有一组生产者进程和一组消费者进程.生产者进程每次生产一个产品放入缓冲区,消费者进程每次从缓冲区中取出一个进程并使用,那么他们之间具有这样一层关系 生产者.消费者共享一个 ...
- 生产者消费问题以及多生产者—消费者问题实现思想
一.生产者消费问题 系统中有一组生产者进程和一组消费者进程,生产者进程每次生产一个产品放入缓冲区,消费者 进程每次从缓冲区中取出一个产品并使用.(注:这里的"产品"理解为某种数据) ...
- 【操作系统-进程】PV操作——生产者消费者问题
文章目录 生产者消费者问题的万能方法步骤 Step 1. 有几类进程 Step 2. 用中文描述动作 Step 3. 添加 PV 操作,用中文描述里面的操作 Step 4. 检查是否出现死锁 Step ...
- 操作系统 | PV操作七大经典问题 生产者消费者 读者写者 哲学家进餐 理发师理发睡觉 和尚打水 吸烟者 吃水果
一.生产者消费者问题 生产者消费者问题(英语:Producer-consumer problem),也称有限缓冲问题(英语:Bounded-buffer problem),是一个多线程同步问题的经典案 ...
最新文章
- 对象分割--Fully Convolutional Instance-aware Semantic Segmentation
- java maven centos7 yum安装
- python学习路线-2020年 Python学习路线及学习目标规划 拿走不谢!
- 顺序二叉树(基于数组存储树结点)
- 四十六、You-Get爬取B站热门排名的小视频
- [AaronYang]C#人爱学不学[1]
- 关于 try catch 捕捉不到异常
- python学习资源分享
- SQL server 2008 r2 安装出错 Could not open key:
- 基于HyperVID数据集训练自己的车型识别系统
- 理光2014ad扫描服务器响应,理光mp2014ad扫描驱动和打印驱动
- 【编程题】【Scratch二级】2021.06 绘制五彩缤纷的多瓣花
- 自动生成Makefile的全过程详解2
- 位置定位LocationManager
- 异步下载小说《诡秘之主》
- 鸿蒙灵根有哪些,关于神话中十大灵根,你知道的有我多吗?
- 用Python实现地理信息出图(含比例尺、指北针、图例)
- 互联神州CCSP冬季集训班信息
- 迅捷CAD编辑器如何将图片转换为CAD
- Android UI设计:Gallery