如果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个人不会都拿起一只筷子,就行了。
如果5位哲学家同时执行down(&mutex);就出问题啦;
我想拉一个,主要就是在死锁是,强制一位吃饭。
不知对否?
兄台,第一个问题,关于5为哲学家同时执行down(&mutex);的情况是不可能的,你想想,这个函数里边的那个原子操作总是只能同时一个哲学家执行,就是说不可能 同时他们5个人都 同时睡眠在这个函数。 除非你电脑是5核的,而且系统没什么并行控制。
第二个问题不太明白你意思,是不是解决的方法或者思路?
可以这么想: 只要他们5个人不会都拿起一只筷子,就行了。
#3
肯定可以,首先你吧5个哲学家看做独立的,互不影响,这不是多线程问题,而是5个不同的来源
#4
这个不难吧******……
#1
#2
我看的现代操作系统93页感觉有问题?
如果5位哲学家同时执行down(&mutex);就出问题啦;
我想拉一个,主要就是在死锁是,强制一位吃饭。
不知对否?
兄台,第一个问题,关于5为哲学家同时执行down(&mutex);的情况是不可能的,你想想,这个函数里边的那个原子操作总是只能同时一个哲学家执行,就是说不可能 同时他们5个人都 同时睡眠在这个函数。 除非你电脑是5核的,而且系统没什么并行控制。
第二个问题不太明白你意思,是不是解决的方法或者思路?
可以这么想: 只要他们5个人不会都拿起一只筷子,就行了。
如果5位哲学家同时执行down(&mutex);就出问题啦;
我想拉一个,主要就是在死锁是,强制一位吃饭。
不知对否?
兄台,第一个问题,关于5为哲学家同时执行down(&mutex);的情况是不可能的,你想想,这个函数里边的那个原子操作总是只能同时一个哲学家执行,就是说不可能 同时他们5个人都 同时睡眠在这个函数。 除非你电脑是5核的,而且系统没什么并行控制。
第二个问题不太明白你意思,是不是解决的方法或者思路?
可以这么想: 只要他们5个人不会都拿起一只筷子,就行了。
#3
肯定可以,首先你吧5个哲学家看做独立的,互不影响,这不是多线程问题,而是5个不同的来源
#4
这个不难吧******……