目录

1.问题描述

2.问题分析

3.问题实现

3.1 初始化

3.2 生产者

3.3 消费者


1.问题描述

要求如下:

  • 只要缓冲区没满,生产者才能把产品放入缓冲区,否则必须等待。
  • 只有缓冲区不空时,消费者才能从中取出产品,否则必须等待。
  • 缓冲区是临界资源,各进程必须互斥地访问。

2.问题分析

如何用信号量机制(P、V操作)实现生产者、消费者进程的这些功能呢?信号量机制可以实现互斥、同步、对一类资源的申请和释放。

  • 互斥:设置初值为1的互斥信号量。
  • 同步:设置初值为0的同步信号量(实现“一前一后”)。
  • 对同一类资源的申请和释放:设置一个信号量,初值为资源的数量(本质上也属于“同步问题”,若无空闲资源,则申请资源的进程需要等待别的进程释放资源后才能继续往下执行)。

生产者-消费者问题中的同步关系:

  1. 同步关系:缓冲区满时,生产者要等待消费者取走商品。
  2. 同步关系:缓冲区为空时(即没有产品时),消费者要等待生产者放入商品。

生产者-消费者问题中的互斥关系:

  1. 互斥关系:缓冲区是临界资源,各进程之间必须互斥。

3.问题实现

3.1 初始化

semaphore mutex = 1;//互斥信号量,实现对缓冲区的互斥访问
semaphore empty = n;//同步信号量,实现空闲缓冲区的数量
semaphore full = 0;//同步信号量,标识产品数量,也即非空缓冲区的数量

3.2 生产者

producer(){while(1){生产一个产品;P(empty);//消耗一个空闲缓冲区P(mutex);把产品放入一个缓冲区;V(mutex);V(full);//增加一个产品}}

3.3 消费者

consumer(){while(1){P(full);//消耗一个产品(非空缓冲区)P(mutex);从缓冲区取出一个产品;V(mutex);V(empty);//增加一个空闲缓冲区使用产品;}}

思考:如果改变相邻P操作的顺序会出现什么情况?

若此时缓冲区内已经放满产品,则empty=0,full=n。

生产者执行P(mutex)使得mutex=0,再执行P(empty),由于已经没有空闲缓冲区。因此生产者被阻塞。由于生产者被阻塞,因此切换回消费者进程。消费者进程执行P(mutex),由于mutex=0,即生产者还没有释放对临界资源的“锁”,因此消费者也被阻塞。

这就造成了生产者等待消费者释放空闲的缓冲区,而消费者又等待生产者释放临界区的情况,生产者和消费者循环等待被对方唤醒,出现“死锁”。因此,实现互斥地P操作一定要在实现同步的P操作之后。

生产者-消费者问题(详解)相关推荐

  1. 生产者/消费者模型详解(基于Java)

    title: 生产者消费者模型 tags: 多线程 synchronized 锁 wait() notify() 生产者/消费者模型原理以及代码实现 一.生产者/消费者模型原理 所谓的生产者消费者模型 ...

  2. 单线程下的生产者--消费者模式详解,wait和sleep的区别

    1. 单线程下的生产者--消费者模式 1.1 该模式下,一个线程生产数据,另一个线程处理数据.当数据还没被处理,那么生产数据的线程进入等待状态:如果数据还没生产,那么处理数据的线程进入等待状态,代码及 ...

  3. C++11 并发指南九(综合运用: C++11 多线程下生产者消费者模型详解)

    前面八章介绍了 C++11 并发编程的基础(抱歉哈,第五章-第八章还在草稿中),本文将综合运用 C++11 中的新的基础设施(主要是多线程.锁.条件变量)来阐述一个经典问题--生产者消费者模型,并给出 ...

  4. 线程同步之 生产者消费者模型详解

    前言 博主本来没打算讲这个比较前面的知识的(博主socket编程还有两个部分没讲,进程也才写完回收僵尸进程的三种方法,信号捕捉器也才完结),但是今天有朋友来问博主,什么是生产者消费者模型,所以博主就先 ...

  5. 操作系统实验 生产者消费者问题详解

    操作系统课程设计 生产者消费者实验报告 一.实验目的 加深对进程概念的理解,明确进程与程序的区别. 认识并发执行的本质. 理解和掌握Linux和Windows进程通信系统调用的功能,通过实验和学习,提 ...

  6. 生产者消费者模型详解

    生产者消费者模型 文章目录 生产者消费者模型 什么是生产者消费者模型 基于BlockingQueue的生产者消费者模型 单生产者单消费者模型 多生产者多消费者模型 什么是生产者消费者模型 生产者消费者 ...

  7. Java线程生产者消费者问题详解

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

  8. 生产者消费者模型详解以及实现

    生产者消费者模式 我们先来看看什么是生产者消费者模式,生产者消费者模式是程序设计中非常常见的一种设计模式,被广泛运用在解耦.消息队列等场景.在现实世界中,我们把生产商品的一方称为生产者,把消费商品的一 ...

  9. 生产者消费者模型---详解及代码实现

    概念 生产者消费者模式就是通过一个容器来解决生产者和消费者的强耦合问题.生产者和消费者彼此之间不直接通讯,而通过阻塞队列来进行通讯,所以生产者生产完数据之后不用等待消费者处理,直接扔给阻塞队列,消费者 ...

  10. 生产者消费者模式详解(转载)

    ★简介 在实际的软件开发过程中,经常会碰到如下场景:某个模块负责产生数据,这些数据由另一个模块来负责处理(此处的模块是广义的,可以是类.函数.线程.进程等).产生数据的模块,就形象地称为生产者:而处理 ...

最新文章

  1. flex java socket通信
  2. mysql事务的4大特性
  3. sql 按字段指定值排序
  4. 网络资源备份 杨萃先书
  5. Yelp研发实践:使用服务拆分单块应用
  6. python中变量的基本使用及命名规则
  7. 网易云信助春招上“云” ,疫情过后线上招聘或成常态
  8. EL表达式中fn函数(转载)
  9. 微服务的概念——《微服务设计》读书笔记
  10. Python服务器开发三:Socket
  11. 【转】MySQL中select * for update锁表的问题
  12. 外设驱动库开发笔记34:OLED显示屏驱动
  13. 【转载】Linux 命令行快捷键 - 移动光标
  14. 309. 最佳买卖股票时机含冷冻期
  15. Topic Model的分类总结(LDA变种)
  16. 激光点云数据编辑处理(一)——CloudCompare
  17. 电容触摸按键实验(STM32F407)
  18. tplink怎么进去_手机怎么进入tplink路由器设置界面?
  19. 自然语言处理之词移距离Word Mover's Distance
  20. android 播放滴一声

热门文章

  1. c语言基础课第二次作业
  2. php中session时间,php中session过期时间的设置方法
  3. spring cloud设置session过期时间
  4. websocket简介及上手,node + vue实现websocket服务
  5. 持续更新--Smali代码库
  6. 【微信公众号开发】【3】自定义菜单
  7. 防止账号关联,该怎么做?
  8. Java中的Scanner用法解析
  9. 【USB笔记】配置描述符Configuration Descriptor
  10. 有时候Mac下删除文件磁盘空间无法释放