死锁-猩猩过谷

题目:一个主修人类学,辅修计算机科学的学生参加了一个 课题,调查是否可以教会非洲狒狒理解死锁.他找到 一处很深的峡谷,在上边固定了一根横跨峡谷的绳索, 这样狒狒就可以攀住绳索越过峡谷.同一时刻,只要 朝着相同的方向就可以有几只狒狒通过.但如果向东 和向西的狒狒同时攀在绳索上那么会产生死锁(狒狒 会被卡在中间),由于它们无法在绳索上从另一只的 背上翻过去.如果一只狒狒想越过峡谷,它必须看当 前是否有别的狒狒正在逆向通行.利用信号量编写一 个避免死锁的程序来解决该问题.


解答:


#define EAST 1
#define WEST 2
#define NULL 0
typedef int semaphore  
int STATE = NULL  // initialize
semaphore mutex = 1;
semaphore eastward = 0;
semaphore westward = 0;
int EASTCount = 0;
int WESTCount = 0;

void crossEastWard(){
 down(&mutex); // 这一步确保判定方向的时候只有一个狒狒
  if( state == NULL || state == EAST )  {
 state = EAST;  up(&eastward);
 }
 EASTCount++;    //记录要通过的猩猩数量
 up(&mutex);

 down(&eastward);   //开始过峡谷
 cross();

 down(&mutex);  //离开峡谷的时候由于有更新所以也得确保互斥访问
 EASTCount--;
 if( EASTCount == 0 )
{
 STATE = NULL;
 for( int i = 0  i < WESTCount  i++ )
     up(&westward);
 if( WESTCount > 0 ) state = WEST; 
}
 up(&mutex);
 }

类似的情况:

void crossWestWard(){
 down(&mutex); // 这一步确保判定方向的时候只有一个狒狒
  if( state == NULL || state == WEST)  {
 state = WEST;  up(&westward);
 }
WESTCount  ++;    //记录要通过的猩猩数量
 up(&mutex);

 down(&westward);   //开始过峡谷
 cross();

 down(&mutex);  //离开峡谷的时候由于有更新所以也得确保互斥访问
 WESTCount --;
 if( WESTCount == 0 )
{
 STATE = NULL;
 for( int i = 0  i < EASTCount;i++ )
     up(&eastward);
 if( EASTCount> 0 ) state = EAST; 
}
 up(&mutex);
 }



  • 2
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值