您的位置 首页 百科问答

哲学家就餐问题

问题补充说明:#define N 5 //五个哲学家 #define THINKING 0 #define HUNGRY 1 #define EATING 2 int state[N] //定义哲Void test(int i){ if(state[i]==HUNGRY) && (state[(i-1)%5]!=EATING) &&(state[(i+1)%5]!=EATING) { state[i]=EATING; V(&s[i]);(不懂,什么意思) }}state[i]=THINKING;s[i]=0;Void philosopher(int i){ while (true) { 思考; P(mutex);(还有这个地方也不太懂) state[i]=HUNGRY; test (i); V(mutex); P(s[i]); 拿左筷子; 拿右筷子; 进食; 放右筷子; 放左筷子;} P(mutex); state[i]=THINKING; test([i-1]%5); test([i+1]%5); V(mutex);}两个标注不懂的地方,望解决,感激不尽。

哲学家就餐问题

两个地方应该是pv操作,pv都是操作元语,不可中断

p操作是将信号量-1

v操作是将信号量+1

pv一定要动象越配对使用

哲学家进餐可以通过信号量机制解决,避免死锁

注释如下:

Voidtest(inti)//测试哲学家i是否满足e来自ating条件

{

if360问答(state[i]==HUNGRY)//状态为hungry且左右均让果但未在eating状态,即筷子空闲

&&(state[(i-1)%5]!=EATING)

&&(state[(i+1)%5]!=EATING)

{

state[i]=EAT严优清微京商团们引当赵ING;//设置哲学家i的状态标志为eating

V(&s[i]);(不懂,什么意思)//s[i]初始化为0,表示能否eating的信号量,V之后s[i]=1,可以

}河抓句年阻程突装//通过P操作后进入eating,否则在P(欢抓吗把s[i])处阻塞

}

st古按至引红发轮命象哪ate[i]=TH叶用否指具乎音名INKING;//初始化状态位

s[i]=0;//初始化s[i]信号量

Voidphilosopher(inti)

{while(true)

{

思考;

P(mutex);(还有这个地方也不太懂)//对mutex进行P操作,即加锁,防止过

//多进程同时执行造成死锁

state[i]=洲HUNGRY;//设置i状态

test(i);//测试是否可以进eating,如可以,设置

//相应标志位和信号量

V(mutex);才基危八率使//释放信号量,其它进程可执行P(mutex)

P(s[i]);/洋样天口路等攻须/测试是否可以eatin部友位挥批许急源g

//以下为哲学家i的eating过程

拿左筷子;

拿右筷子;

进食;

放右超将护微省电雷与原师速筷子;

放左筷子;

}

P(mutex);//对mutex加锁,防止多个进程同时对state[i]操作

state[i]=THINKING;//设置i状态

test([i-1]%5);//为左边和右边测试并设置s状态

test([i+1]%5);

史孔费V(mutex);//释放信号量

}

上一篇 魔兽世界 实验场任务怎么做
下一篇 内刊文章怎么写?
扫一扫,手机访问

扫一扫,手机浏览