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