多生产者-多消费者问题

🍎🍊
问题描述
模型特点
与经典生产者消费者模型不同,存在多类生产者多类消费者,各自生产/消费不同类型的产品
具体场景
  • 共享资源:容量为1的盘子(缓冲区)
  • 生产者1(父亲):专门放入苹果
  • 生产者2(母亲):专门放入橘子
  • 消费者1(女儿):专门取出苹果
  • 消费者2(儿子):专门取出橘子
🔗
进程关系分析
互斥关系
对盘子的访问需要互斥
同步关系
  • 父亲放入苹果 → 女儿取出苹果
  • 母亲放入橘子 → 儿子取出橘子
  • 女儿/儿子取出水果 → 父亲/母亲放入水果
抽象理解
  • 将同步关系理解为事件先后关系而非进程行为关系
  • "盘子为空"事件由女儿或儿子触发
  • "放入水果"事件由父亲或母亲执行
🔢
信号量设置
  • mutex=1:实现互斥访问盘子
  • apple=0:盘子中苹果数量
  • orange=0:盘子中橘子数量
  • plate=1:盘子剩余容量
生产者逻辑
准备水果 → P(plate) → P(mutex) → 放入 → V(mutex) → V(对应水果信号量)
消费者逻辑
P(对应水果信号量) → P(mutex) → 取出 → V(mutex) → V(plate) → 消费
⚠️
特殊情况分析
缓冲区大小为1时
  • 可能不需要mutex信号量
  • 因为三个同步信号量(apple/orange/plate)任一时刻最多一个为1
  • 保证任何时候只有一个进程能通过P操作
缓冲区大小>1时
  • 必须使用mutex保证互斥访问
  • 否则可能出现多个生产者同时通过P(plate),导致并发访问和数据覆盖
🔑
重要原则
  • PV操作顺序:互斥P操作必须在同步P操作之后,否则可能引起死锁
  • 分析角度:应从事件先后关系角度抽象分析同步关系,而非从单个进程行为角度分析
考试重点
  • 缓冲区容量与互斥需求的关联性分析
  • 同步信号量设计(特别是plate信号量的使用)
易错点
  • 混淆"多类"生产/消费者与经典单类模型的差异
  • 错误安排PV操作顺序导致死锁
  • 从进程行为而非事件关系角度分析同步