美文网首页
哲学家进餐问题

哲学家进餐问题

作者: NiNko | 来源:发表于2020-03-16 19:38 被阅读0次
  • 问题描述

一张圆桌旁坐了五个哲学家,每两名哲学家中间有一根筷子,每个哲学家面前有一碗米饭。哲学家重复的做思考和进餐两个操作。哲学家思考时不影响其他人,当哲学家饥饿时,才会试图拿起两边的筷子,筷子需要一根一根的拿起。只有拿起两根筷子才能进餐。

  • 问题分析

相邻的哲学家对他们中间的筷子是互斥关系。解决问题的关键是如何让一名哲学家拿到左右两根筷子而不造成死锁或者饥饿现象。对哲学家和筷子进行编号。设置一个互斥信号量数组

semaphore chopstick[5]={1,1,1,1,1}
Pi(){
  do{
    P(chopstick[i]);
    P(chopstick[i+1]);
    // 进餐
    V(chopstick[i]);
    V(chopstick[i+1]);
    // 思考
  }while(1)
}

上述算法存在问题,当五个哲学家同时拿起左手边的筷子,再想拿起右手边的筷子时会死锁。为了解决这个问题,可以给哲学家拿筷子的动作进行一些限制。比如每个哲学家仅当可以左右手旁边的筷子都可用时才允许拿筷子,又或者对哲学家编号,让奇数号哲学家只能拿左手边筷子,偶数号只能拿右手边筷子。


  • 解决方案1

当一名哲学家左右两边筷子都能用时才允许他拿起筷子。

semaphore chopstick[5]={1,1,1,1,1}
semaphore mutex=1;
Pi(){
  do{
    P(mutex);
    P(chopstick[i]);
    P(chopstick[i+1]);
    V(mutex);
    // 进餐
    V(chopstick[i]);
    V(chopstick[i+1]);
    // 思考
  }while(1)
}

这种方法就是将取左右两边筷子的行为定义成一个原子操作,拿筷子时只能一次同时拿起两根筷子。

  • 解决方案二
semaphore chopstick[5]={1,1,1,1,1}
semaphore mutex=1;
Pi(int i){
  do{
    if(i % 2 == 0){
      P(chopstick[i]);
      P(chopstick[i+1]);
      // 进餐
      V(chopstick[i]);
      V(chopstick[i+1]);
      // 思考
    }else{
      P(chopstick[i+1]);
      P(chopstick[i]);
      // 进餐
      V(chopstick[i+1]);
      V(chopstick[i]);
    }
  }while(1)
}

相关文章

  • 哲学家进餐问题

    1965年,荷兰计算机科学家图灵奖得主Edsger Wybe Dijkstra提出并解决了一个他称之为哲学家进餐的...

  • 哲学家进餐问题

    问题描述 一张圆桌旁坐了五个哲学家,每两名哲学家中间有一根筷子,每个哲学家面前有一碗米饭。哲学家重复的做思考和进餐...

  • 哲学家进餐问题

    哲学家进餐问题是著名的死锁问题,5个哲学家,5根筷子,每个哲学家进餐需要获得左右两根筷子才可以; 信号量 使用信号...

  • 经典PIC问题

    哲学家进餐: 哲学家问题可出现拿起左边的筷子,然后拿起右边的筷子进餐,但是假如五个哲学家同时拿起左边的筷子,那么右...

  • 哲学家进餐

    哲学家进餐 VC++相关演示,本源码演示了线程同步算法的哲学家进餐问题,说明:本程序是操作系统中比较典型的线程同步...

  • windows下 c 实现哲学家进餐问题

  • 【专项专攻】01-哲学家进餐问题

    前言: 当一位哲学家思考时,他与其他同事不交流。时而,他会感到饥饿,并试图拿起与他相近的两根筷子(筷子在他和他的左...

  • Java 死锁分类

    1. 死锁简介 经典的“哲学家进餐”问题很好的描述了死锁的情况。5个哲学家吃中餐,坐在一张圆桌上,有5根筷子,每个...

  • 线程同步导致的问题死锁哲学家进餐问题

    请关注我的微信公众号 个人微信公众号 技术交流群 (仅作技术交流):642646237 ​请关注我的头条号: 线程...

  • 8.2 经典进程同步问题-哲学家进餐问题

    问题描述 一张圆桌上坐着5名哲学家,每两个哲学家之间的桌上摆一根筷子,桌子的中间是一碗米饭。哲学家们倾注毕生精力用...

网友评论

      本文标题:哲学家进餐问题

      本文链接:https://www.haomeiwen.com/subject/ynqoehtx.html