生产者消费者问题

生产者消费者问题

问题描述

系统中有一组生产者进程和一组消费者进程,生产者进程每次生产一个产品放入缓冲区,消费者进程每次从缓冲区中取出一个产品并使用。

生产者、消费者共享一个初始为空、大小为n的缓冲区。

只有缓冲区没满时,生产者才能把产品放入缓冲区,否则必须等待。

只有缓冲区不空时,消费者才能从重取出产品。否则必须等待。

Snipaste_2020-11-04_15-07-30

问题分析

Snipaste_2020-11-04_15-10-28

如何实现

Snipaste_2020-11-04_15-11-26

思考:能否改变相邻P、V操作的顺序

Snipaste_2020-11-04_15-12-19

Snipaste_2020-11-04_14-59-45

多生产者、多消费者

问题描述

Snipaste_2020-11-04_16-26-57

问题分析

  1. 关系分析。找出题目中的各个进程,分析它们之间的同步、互斥
  2. 整理思路。根据各进程的操作流程确定P、V操作的大致顺序。
  3. 设置信号量。设置需要的信号量,并根据题目条件确定信号量初值

互斥关系:(mutex=1)

​ 对缓冲区(盘子)的访问要互斥地进行

同步关系:(一前一后)

  1. 父亲将苹果放入盘子,女儿才能取苹果
  2. 母亲将橘子放入盘子后,儿子才能取橘子
  3. 只有盘子为空时,父亲或母亲才能放入水果

“盘子为空”这个事件可以由儿子或女儿触发,事件发生后才允许父亲或母亲放水果

如何实现

Snipaste_2020-11-04_15-25-04

问题:可不可以用互斥信号量?

Snipaste_2020-11-04_15-26-47

结论:

​ 即使不设置专门互斥变量mutex,也不会出现多个进程同时访问盘子的现象。

原因在于:本题中的缓冲区大小为1,在任何时刻,apple、orange、plate三个同步信号量中最多只有一个是1,因此在任何时刻,最多只有一个进程的P操作不会被阻塞,并顺利地进入临界区..

知识回顾与重要考点

解决“多生产者——多消费者问题”的关键在于理清复杂的同步关系

在分析同步问题(一前一后问题)的时候不能从单个进程行为的角度来分析,要把“一前一后”发生的事看做是两种“事件”的前后关系

比如,如果从单个进程行为的角度来考虑的话,我们会有以下结论:

​ 如果盘子里装有苹果,那么一定要女儿取走苹果后父亲或母亲才能再放入水果

​ 如果盘子里装有橘子,那么一定要儿子取走橘子后父亲或母亲才能再放入水果

​ 这么看是否就意味着要设置四个同步信号量分别实现这四个“一前一后”的关系了?

正确的分析方法就应该从“事件“的角度来考虑,我们可以把上述四对“进程行为的前后关系”抽象为一对“事件的前后关系”

盘子变空事件->放入水果事件。“盘子变空事件”既可以由儿子引发,也可由女儿引发;“放入水果事件”既可以是父亲执行,也不可以是母亲执行。这样的话,就可以用一个同步信号量解决问题了。

Snipaste_2020-11-04_16-42-05

本文作者:codeFiler

本文链接:https://www.cnblogs.com/coderD/p/13926834.html

版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。

posted @   codeFiler  阅读(229)  评论(0编辑  收藏  举报
编辑推荐:
· .NET制作智能桌面机器人:结合BotSharp智能体框架开发语音交互
· 软件产品开发中常见的10个问题及处理方法
· .NET 原生驾驭 AI 新基建实战系列:向量数据库的应用与畅想
· 从问题排查到源码分析:ActiveMQ消费端频繁日志刷屏的秘密
· 一次Java后端服务间歇性响应慢的问题排查记录
阅读排行:
· 《HelloGitHub》第 108 期
· Windows桌面应用自动更新解决方案SharpUpdater5发布
· 我的家庭实验室服务器集群硬件清单
· Supergateway:MCP服务器的远程调试与集成工具
· C# 13 中的新增功能实操
点击右上角即可分享
微信分享提示
评论
收藏
关注
推荐
深色
回顶
收起