回 帖 发 新 帖 刷新版面

主题:完了,五个哲学家吃饭问题怎么办哦?我总是让他们饿死,哪位仁兄说说不让他们饿死的为法,谢谢了。

设有五位哲学家,共享一张放有五把椅子的桌子,每人分得一把椅子。但是,但是桌子上总共只有5支筷子,在每人两边各放一支。哲学家们在饥饿是才试图分两次从两边拾起筷子就餐。
(1)哲学家要有两支筷子才能就餐。
(2)如果筷子已在其它人手上,则该哲学家就要等到他人吃完后才拿筷子。
(3)任一哲学家在自己未拿到两支筷子吃饭之前,决不放下自己手中的筷子。
试:
用P,V原语实现,要求至少有一位哲学家能吃到饭,也就是不要让哲学家们都吃不到饭,全部饿死。

回复列表 (共6个回复)

沙发

规定:1。最多4个人可以去拿其左边的筷子
      2。拿齐2支筷子后才能进餐
      3。奇数哲学家先拿左边筷子,偶数哲学家先拿右边的筷子

板凳

如果换我我就直接下手去抓饭,免得饿死。
呵呵!开个玩笑而已。以下是解决哲学家温饱问题的源码。[em1]

#include <stdio.h>
#include <stdlib.h>
#define SizeArray 5

typedef struct {int value;}Key;
typedef struct
{
       int left;
       int right;
       int busy;
}Man;

int getkey( int *blpKey, int *blpMan, int *blpBusy )
{
       if( *blpKey )
       {
              if(*blpMan)       {     return 0;    }
              else               {     return 1;    }
       }
       else
       {
              *blpMan = 1;
              *blpKey = 1;
              ++(*blpBusy);
              return 1;
       }

}
Man       aMan[SizeArray];
Key       aKey[SizeArray];

#define NextAp          ((ap+SizeArray+1)%SizeArray)

#define DGetRight(ap,NextAp)       getkey( &(aKey[NextAp].value), \
                                            &(aMan[ap].right),       \
                                        &(aMan[ap].busy))
/*上边的 \不是 / !*/
#define DGetLeft(ap,NextAp)        getkey( &(aKey[NextAp].value), \
                                        &(aMan[ap].left),      \
                                        &(aMan[ap].busy))
int count;
int main( void )
{
    int ap;
       int i;
       /*for( i=0 ; i < SizeArray ; ++i )
       {
              aMan[i].left = 0;
              aMan[i].right= 0;
              aMan[i].busy = 0;
              aKey[i].value= 0;
       }
   */
       /* test 1000 no. */
       for( i=0; i<1000; ++i )
       {
              ap = rand() % SizeArray ; /*SizeArray = 5 ..this */
              if ( aMan[ap].busy == 2 ) /* had 2 key ,down all !! */
              {
                     ++count; /*record had thing to eating */
                     aMan[ap].left = 0;
                     aMan[ap].right= 0;
                     aMan[ap].busy = 0;
                     aKey[ap].value     = 0;
                     aKey[NextAp].value = 0;

              }
              else
              {
                     if( ap % 2 )
                     {
                            if ( DGetRight(ap,ap) )    { continue;}
                            else{        DGetLeft(ap,NextAp) ;continue;}

                     }
                     else
                     {
                            if ( DGetLeft(ap,NextAp))  { continue;}
                            else{       DGetRight(ap,ap) ;continue; }
                     }
              }
       } /*end for.. */
       printf("dream : test = %d : %d ",500,count);
       return 0;
}   /*end main..*/

3 楼

好象可以了哦!

4 楼

一楼的方法我觉得很好。
二楼的我觉得太复杂了[em10]

5 楼

谢谢你的30分,呵呵

6 楼

我现在会了
真的非常谢谢各位了

我来回复

您尚未登录,请登录后再回复。点此登录或注册