狒狒过谷问题(经典PV问题)

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

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

相关文档
最新文档