-->
当前位置:首页 > 题库 > 正文内容

主观题:h410.设有5个哲学家,共享一张方有5把椅子的桌子,每人分得一把椅子。但是桌子上总共只有5支筷子,在每个人两边各放一支。.......

Luz2年前 (2022-09-13)题库383
设有5个哲学家,共享一张方有5把椅子的桌子,每人分得一把椅子。但是桌子上总共只有5支筷子,在每个人两边各放一支。哲学家中有饥饿时才试图分两次从两边拾起筷子就餐。就餐的条件是:
(1)哲学家想吃饭时,先提出吃饭的要求;
(2)提出吃饭要求,并得到2支筷子后,方可吃饭;
(3)如果筷子已被他人获得,则必须等待该人吃完饭后才能获得筷子;
(4)任何哲学家在自己为拿到2支筷子吃饭之前,决不放下手中的筷子;
(5)刚开始就餐时,只允许2个哲学家请求吃饭。
试问:
描述一个保证不会出现两个邻座同时要求吃饭的算法;







答案:解:
semaphore S[5]={0,0,0,0,0}; //同步信号量,用于阻塞对应的哲学家
semaphore mutex=1; //互斥信号量,用于互斥访问标志变量
int flag[5]={0,0,0,0,0}; //标志变量
Pi ( ) //第i号哲学家的活动过程,i=0,1,2,3,4
{
m=(i+1)%5;
n=(i-1+5)%5;
L1: P(mutex);
if (flag[m]==1 || flag[n]==1)(3分)
{
V(mutex);
flag[i] = -1;
P(S[i]);
goto L1;
}
flag[i]=1; //flag[i]=1表示第i号哲学家要求吃饭
V(mutex);
拿起左边筷子;
拿起右边筷子;
吃饭;
放下左边筷子;
放下右边筷子;
P(mutex);
flag[i]=0;
if (flag[m]== -1) //若右边哲学家正在等待,则唤醒之(3分)
{ flag[m]=0; V(S[m]); }
if (flag[n]== -1) //若左边哲学家正在等待,则唤醒之
{ flag[m]=0; V(S[m]); }
V(mutex);
}
parbegin
P0( );
P1( );
P2( );
P3( );
P4( );
parend(4分)
【说明】上述算法由于能保证不会出现两个邻座同时要求吃饭的情况,因此也就能保证只有2个哲学家请求吃饭。还能保证不可能有两人取同一根筷子(从而取筷子也不需要考虑互斥问题)。但是上述算法可能出现饿死现象。例如,1、3号哲学家吃饭时,2号哲学家不可能吃饭。假设1号哲学家先吃完,但在3号哲学家吃完之前,1号哲学家又吃饭;3号哲学家吃完后,在1号哲学家吃完之前又要求吃饭,如此1、3号哲学家轮流交替吃饭,2号哲学家将饿死。

发表评论

访客

◎欢迎参与讨论,请在这里发表您的看法和观点。