哲学家聚餐问题?

时间:2022-02-14 22:12:23
我看的现代操作系统93页感觉有问题?

如果5位哲学家同时执行down(&mutex);就出问题啦;
我想拉一个,主要就是在死锁是,强制一位吃饭。
不知对否? 哲学家聚餐问题?

#include<iostream>
#include<vector>
#define N 5
using namespace std;
vector<int> total;
total.resize(5,1);//标记开始时5位哲学家都在思考  1为思考,0为吃饭 
bool m_force=false;//标记是否正在强制吃饭 ,开始为没有 
int phi(int i)
{
  while(true)
  {
    think( i);
    take_out_chorks(i);         
  }  
    
}
int take_out_chorks(i)
{
   int left=(i+N-1)%N;
   int right=(i+1)%N;
   if(m_force||total[left]==0||total[right]==0)//如果左右再吃就返回去思考 
    return 0;
   else if
   {
      total[i]=0;//这位哲学家吃饭但未拿筷子 
      Sleep(10);//等待10毫秒
      if(total[left]==0||total[right]==0)//如果大于3人同时标记为0 
       {
       if(m_force) { total[i]=1; reurn 0;}
       m_force=true;
       proce(total);
       }
      else if
       {
          eat(i);//开始吃饭
          put_chork(i);
          return 1;  
       }
      
   }
}
int proce(vector<int> m_total)
{
    static int turn=-1;//为啦公平期间动态轮流 一人吃饭 
    pre: turn=(++turn)%N;
    if(m_total[turn]==1)
     goto pre;
    eat(turn);
    put_chork(turn);
    
}


int put_chork(int i)
{
    total[i]=1;//重新标记为思考状态
    if(m_chorck)//如果被强制 
      {
      total.assign(5,1);//置为初始化状态 
      m_chorck=false;
      } 
  return 1;
}




4 个解决方案

#1


哲学家聚餐问题?

#2


我看的现代操作系统93页感觉有问题?

如果5位哲学家同时执行down(&mutex);就出问题啦;
我想拉一个,主要就是在死锁是,强制一位吃饭。
不知对否?

兄台,第一个问题,关于5为哲学家同时执行down(&mutex);的情况是不可能的,你想想,这个函数里边的那个原子操作总是只能同时一个哲学家执行,就是说不可能 同时他们5个人都 同时睡眠在这个函数。 除非你电脑是5核的,而且系统没什么并行控制。

第二个问题不太明白你意思,是不是解决的方法或者思路?
可以这么想: 只要他们5个人不会都拿起一只筷子,就行了。

#3


引用 2 楼 hw_henry2008 的回复:
我看的现代操作系统93页感觉有问题?

如果5位哲学家同时执行down(&amp;mutex);就出问题啦;
我想拉一个,主要就是在死锁是,强制一位吃饭。
不知对否?

兄台,第一个问题,关于5为哲学家同时执行down(&amp;mutex);的情况是不可能的,你想想,这个函数里边的那个原子操作总是只能同时一个哲学家执行,就是说不可能同时他们5个人都同时睡眠在这个函数。除非你电脑是5……


肯定可以,首先你吧5个哲学家看做独立的,互不影响,这不是多线程问题,而是5个不同的来源

#4


这个不难吧******……

#1


哲学家聚餐问题?

#2


我看的现代操作系统93页感觉有问题?

如果5位哲学家同时执行down(&mutex);就出问题啦;
我想拉一个,主要就是在死锁是,强制一位吃饭。
不知对否?

兄台,第一个问题,关于5为哲学家同时执行down(&mutex);的情况是不可能的,你想想,这个函数里边的那个原子操作总是只能同时一个哲学家执行,就是说不可能 同时他们5个人都 同时睡眠在这个函数。 除非你电脑是5核的,而且系统没什么并行控制。

第二个问题不太明白你意思,是不是解决的方法或者思路?
可以这么想: 只要他们5个人不会都拿起一只筷子,就行了。

#3


引用 2 楼 hw_henry2008 的回复:
我看的现代操作系统93页感觉有问题?

如果5位哲学家同时执行down(&amp;mutex);就出问题啦;
我想拉一个,主要就是在死锁是,强制一位吃饭。
不知对否?

兄台,第一个问题,关于5为哲学家同时执行down(&amp;mutex);的情况是不可能的,你想想,这个函数里边的那个原子操作总是只能同时一个哲学家执行,就是说不可能同时他们5个人都同时睡眠在这个函数。除非你电脑是5……


肯定可以,首先你吧5个哲学家看做独立的,互不影响,这不是多线程问题,而是5个不同的来源

#4


这个不难吧******……