生产者和消费者问题(单一生产者和单一消费者)
题目一:一组生产者和一组消费者进程共享一个初始为空,大小为n的缓冲区,只有缓冲区没有满的时候,生产者才能把消息放入缓冲区,否则必须等待;只有缓冲区未空时,消费者才可以从中取出消息,否则必须等待。由于缓冲区是临界资源,所必须互斥访问。
关系分析:
1.生产者和消费者对缓冲区的访问是互斥关系;
2.生产和消费者又有着同步关系,必须先生产再消费。
信号量设置:
1.设置mutex作为互斥信号量,让生产者和消费者可以互斥地访问缓冲区,且初始值为1;
2.设置信号量full来表示非空缓冲区的个数,初始值为0;信号量empty来表示空闲缓冲区的个数,初始值为n。
在写代码之前,要明确同步和互斥的代码有什么不同。
1.首先,生产者生产了数据消费者才能消费,所以用full信号量来控制生产者和消费者的这层同步关系,也就是在生产者进程的末尾要加上V(full),在消费者进程取走数据之前需要P(full)。
2.用信号量empty来控制生产者最多只可以往缓冲区中放入n个数据,超过n个数据,生产者进程就会被阻塞。
(在没写这篇博客之前,一直认为只需要full和empty这两个信号量中的一个就行,写到这里就明白了为什么一定要设置两个信号量了)
下面是对生产者和消费者问题的代码描述:
semaphore mutex = 1;
semaphore empty = n;
semaphore full = 0;producer(){while(true){//在这段代码里面,P(empty)和P(mutex)的顺序不能对调,否则会有死锁的可能produce an item //生产数据P(empty); //空的缓冲区个数减少一个P(mutex); //互斥访问缓冲区remove an item to buffer; //临界区V(mutex); //释放缓冲区的使用V(full); //被占用的缓冲区的个数增加}
}consumer(){while(true){//在这段代码里面,P(full)和P(mutex)的顺序不能对调,否则会有死锁的可能P(full);P(mutex);get an item from buffer;V(mutex);V(empty);consume the item;}
}
对于上述代码里出现的注释“//在这段代码里面,P(empty)和P(mutex)的顺序不能对调,否则会有死锁的可能”的解释:
假设生产者进程中的两个P操作的代码顺序改成如下:P(mutex)-->P(empty),消费者进程中的两个P操作顺序改成如下:P(mutex)-->P(full),在什么情况下,会发生死锁呢?
第一种情况:当empty = 0,full = n,当生产者进程执行了P(mutex)之后,mutex变为0,在执行P(empty)时由于empty= 0而被阻塞;则此时切换回消费者进程,消费者进程在执行P(mutex)时由于mutex = 0,消费者进程也被阻塞。这样就造成了生产者等待消费者释放空闲缓冲区,消费者等待生产者释放临界区的情况,生产者和消费者循环等待被对方唤醒,也就产生了死锁。
第二种情况:当empty = n,full = 0时,此时若消费者执行了P(mutex),mutex变为0,在执行P(full)时由于full = 0而被阻塞,但是生产者进程在执行P(mutex)时由于mutex = 0也被阻塞,这样就会出现消费者等待生产者占用缓冲区而生产者等待消费者释放临界区的情况,即出现了死锁。
注意:代码中两个V操作互换顺序不会导致死锁的出现。
生产者和消费者问题(单一生产者和单一消费者)相关推荐
- RabbitMQ 实战(四)消费者 ack 以及 生产者 confirms
2019独角兽企业重金招聘Python工程师标准>>> 这篇文章主要讲 RabbitMQ 中 消费者 ack 以及 生产者 confirms. 如上图,生产者把消息发送到 Rabbi ...
- 用三个线程实现生产者消费者模型,其中一个线程作为生产者,二个线程作为消费者,生产者随机生产一个时间戳或者字符串,消费者消费这个时间戳,并不能重复消费,并将其打印出来
题目要求: 用三个线程实现生产者消费者模型,其中一个线程作为生产者,二个线程作为消费者,生产者随机生产一个时间戳或者字符串,消费者消费这个时间戳,并不能重复消费,并将其打印出来.(这是一道百度面试的算 ...
- java生产者与消费者问题_java生产者与消费者问题
为了回忆一下J2SE中的线程互斥与同步问题,所以今天就写个生产者与消费者问题.这个程序大部分时间的结果都基本正确,但某些时候会造成死锁.百思不得其解,将代码贴上,方便以后有更深的体会时再进行修改.也方 ...
- 生产者消费者代码_生产者消费者模型:Kotlin 多线程读写文件实例
计算机科学中的所有问题,都可以通过添加一个间接层来解决. 生产者消费者模式就是通过一个容器来解决生产者和消费者的强耦合问题. 生产者和消费者彼此之间不直接通讯,而通过阻塞队列来进行通讯,所以生产者生产 ...
- Java多线程-生产者消费者问题(多个消费者多个生产者)
Java多线程-生产者消费者问题(多个消费者多个生产者) public class ConsumerProcuderDemo {public static void main(String[] arg ...
- 生产者消费问题以及多生产者—消费者问题实现思想
一.生产者消费问题 系统中有一组生产者进程和一组消费者进程,生产者进程每次生产一个产品放入缓冲区,消费者 进程每次从缓冲区中取出一个产品并使用.(注:这里的"产品"理解为某种数据) ...
- C语言生产者消费者实验报告,生产者与消费者实验报告.doc
生产者与消费者实验报告.doc 生产者和消费者实验报告[实验目的]1. 加深对进程概念的理解,明确进程和程序的区别.2. 进一步认识并发执行的实质.3. 验证用信号量机制实现进程互斥的方法.4. 验证 ...
- java实现带界面的生产者消费者_Java实现生产者消费者问题与读者写者问题
1.生产者消费者问题 生产者消费者问题是研究多线程程序时绕不开的经典问题之一,它描述是有一块缓冲区作为仓库,生产者可以将产品放入仓库,消费者则可以从仓库中取走产品.解决生产者/消费者问题的方法可分为两 ...
- java生产线消费者,基于Java 生产者消费者模式(详细分析)
生产者消费者模式是多线程中最为常见的模式:生产者线程(一个或多个)生成面包放进篮子里(集合或数组),同时,消费者线程(一个或多个)从篮子里(集合或数组)取出面包消耗.虽然它们任务不同,但处理的资源是相 ...
最新文章
- 利用IIS作为宿主 发布你的WCF Service(转)
- 怎么优雅的处理Java异常?
- CloudStack相关技术-主存储和二级存储
- (私人收藏)[开发必备]HTML5最全快速查找离线手册(可查询可学习,带实例)...
- Oracle 数据库启动 startup和startup force的区别
- 避坑!gulp-imagemin运行出问题
- .NET Core Tools 1.0 版本
- Windows平台WebRTC编译-VS2017
- 已经是最大股东却还要全资收购!腾讯看上了搜狗的啥?
- mysql replace substring 字符串截取处理
- sparksql读取mysql表的两种方式
- java spring server_java server之spring中的IOC如何用java实现?
- 愚人节的礼物 栈
- 简单链表实现增删改查(内部类+递归)
- 最全的国内外电子书籍网站合集
- 实现wpf的doevents
- 27个最佳免费WordPress主题(2022年精选)
- Leetcode 1153 字符串转化
- 什么是聚合路由器、聚合路由器有什么用
- 三星a52屏幕刷新率设置方法分享