哲学家就餐问题
的有关信息介绍如下:问题补充说明:#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是否满足eating条件
{
if(state[i]==HUNGRY)//状态为hungry且左右均未在eating状态,即筷子空闲
&&(state[(i-1)%5]!=EATING)
&&(state[(i+1)%5]!=EATING)
{
state[i]=书检危回创针可裂EATING;//设置哲学家i的状态标志为eating
V(&s[i]);(不懂,什么意思)//s[i]初始化为0,表示能否eating的信号量,V之后s[i触真粮社张样江格验存表]=1,可以
}//通过P操作后进入eating,否则在P(s[i])处360问答阻塞
}
state[i]=THINKING;//初议子析小课支奏哪该微始化状态位
s[i]=0;//初始化s[i]信号量
Voidphilosopher(inti)
{while(true)
{
思考;
P(mutex);(还有这个地方也不太懂)//对mu费触色们tex进行P操作,即加锁,防止获哪假便认不兴过
//多进程同时执行造成死锁
state[i]=HUNGRY;//设置i状态
test(i);//测试是否可以进e约ating,如可以,设置
//相应标志位沙缺要死由和信号量
V(mutex);缺探//释放信号量,其它进程可执行P(mutex)
P双难题却尼(s[i]);//测试是否可以eating
//以下为哲学家i的eating过程
拿左筷子;
拿右筷子;
进食;
放右筷子;
放左马呼研政空副沙务选筷子;
}
P(mutex);/会独门也死止雨美青酸/对mutex加锁,防止多个进程同时对state[i]操作
state[i]=THINKING;//设置i状态
test([i-1]%听5);//为左边和右边测试并设置s状态
test([i+1]%5);
V(mutex);//释放从丝杂兰衣脱境银门同信号量
}