第二章 进程同步之经典同步问题(重点)

生产者-消费者问题

  1. 问题分析
    auN1MR.png
  2. 解决
    aua8UK.png
  3. mutex的p操作不能放到前面,否则会造成死锁
    audco6.png
  • 实现互斥的P操作一定要放到实现同步的P操作之后
  • V操作不会导致进程阻塞,因此两个V操作顺序可以互换
  1. 生产产品的过程和使用产品的过程,会较长,为了避免降低效率(减少上锁时间),不建议将这两个过程放到产品放入缓冲区和从缓冲区取产品的部分
  2. 小结
    au0wr9.png

多生产者-多消费者问题

  1. 问题分析
    auf2zn.png
    auh56I.png
  2. 实现
  • 有mutex
    au4wE8.png
  • 这里可以去掉mutex,plate作为互斥信号量
    au4bK1.png
  • 这里可以是因为缓冲区大小为1,当然加上mutex肯定没错
  • 当缓冲区大小大于1时,要加上mutex互斥信号量
    au5YiF.png
  1. 小结
    au5rdK.png
    auID6s.png
    注:不要从单个进程的角度来看问题,要从事件的角度

读者写者问题

  1. 问题分析
    a3XIET.png
  2. 实现
    a3jaiF.png
  3. 避免写进程饥饿
    a3xy4O.png
  4. 小结
  • 遇到同步问题一般是生产者-消费者问题
  • 遇到包含互斥的一般是复杂的读者-写者问题
    a3z0zQ.png

哲学家进餐问题

  1. 问题分析
    a8kg8x.png
  2. 造成死锁的方法
    a8kbGt.png
  3. 解决思索的方法
    1. 至多允许四个哲学家拿起筷子
    2. 仅当一名哲学家左右两边的筷子都可以用时,才抓起筷子
    3. 对哲学家顺序编号,奇数号先拿左边筷子,再拿右边,偶数号先拿右边筷子再拿左边
      a8M7mq.png
  4. 小结
    a8QmjA.png

吸烟者问题

  1. 问题分析
    a8tifP.png
  2. 实现
    a8tMYq.png
  3. 小结
    a8t86U.png