5位哲学家吃饭问题(算法描述)

/*

设有5个哲学家,共享一张放有5把椅子的桌子,每人分得一把椅子,但是,桌子上共有5只筷子,在每人两边各放一只,哲学家们在肚子饥饿时才试图分两次从两边拿起筷子就餐。
条件:
1)拿到两只筷子时哲学家才开始吃饭。
2)如果筷子已在他人手上,则该哲学家必须等他人吃完之后才能拿到筷子。
3)任一哲学家在自己未拿到两只筷子前却不放下自己手中的筷子。
试:
1)描述一 个保证不会出现两个邻座同时要求吃饭的通信算法。
2)描述一个即没有两个邻座同时吃饭,有没有饿死(永远拿不到筷子)的算法

*/

/* 以下是测试代码 。。。。*/

#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 )
/* had key return 0 . get key or no key(orther got) return 1 */
{
       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..*/
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值