哲学家进餐问题

#问题描述


  • 五个哲学家,五只筷子,他们围成圈,每只筷子夹在两个人中间,他们要么吃饭要么思考,吃饭时要用左右两只筷子吃
  • Pasted image 20260706175024.png
  • 本题呢,就是要学会因临界资源分配不当而造成的死锁现象的解决方法是本题精髓
  • 一共有三个解法,我简单叭叭两句,还有前置小条件
  • 首先,给筷子编个号(信号量数组)kuaizi\[1,1,1,1]
  • 再给哲学家编个号zhexue\[0,1,2,3,4]
  • 依此可见,哲学家左边筷子编号为i,右边编号为(i+1)%5(循环数组
  • 解法一:每次保证只有四个哲学家能干饭
  • 设置一个信号量count=4
  • 哲学家进程:
  • P(count)
  • P(kuaizi\[i])
  • P(kuaizi\[(i+1)%5])
  • 吃饭
  • V(kuaizi\[i])
  • V(kuaizi\[(i+1)%5])
  • V(count)
  • 你看,当有第五个哲学家想吃饭时就会被在第一步就被挂起阻塞,故此时餐桌上始终最多四个人能进入拿筷子准备干饭的代码。
  • 解法二:奇数的哲学家先拿左边筷子,偶数的哲学家先拿右边筷子
  • 这就纯靠代码实现了,用不着信号量,不赘述
  • 解法三:当且仅当哲学家左右两边都有筷子时,才能干饭
  • 设置一个互斥信号量mutex=1,保证哲学家拿左右筷子互斥
  • 进程
  • P(mutex)
  • P(kuaizi\[i])
  • P(kuaizi\[(i+1)%5])
  • V(mutex)
  • 吃饭
  • V(kuaizi\[i])
  • V(kuaizi\[(i+1)%5])
  • 但该解法有点小毛病,就是有的哲学家即使左右两边有筷子也会被挂在mutex下等待
  • 有毛病,但不多