红黑客问题

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

这个是我写的版本,请指教

////////////////公用变量/////////////////////////

int rc=0; //上船红客计数

int bc=0; //上船黑客计数

int i=-1; //数组下标,公用

Semaphore sail=new Sempahore(0); //开船信号量Semaphore empty=new Semaphore(4); //上船名额分配Semaphore[] go=new Semaphore[4]; //上船信号量Semaphore mutex=new mutex(1); //互斥量Semaphore[] land=new Semaphore[4]; //登陆信号量Semaphore s=new Semaphore(0); //不符合的等待信号量int t=0; //排在s的计数

/////////////////////////船//////////////////////////

class Boat extends PVableThread{

public run()

{while(true)

{

p(sail);

for(int k=0;k<4;k++) v(go[k]);

System.out.println("BOA T sailing ");

for(int k=0;k<4;k++) p(land[k]);

System.out.println("BOA T landing ");

System.out.println("BOA T backing ");

p(mutex); //re-init

i=-1;

rc=0;

bc=0;

for(int k=0;k

t=0;

for(int k=0;k<4;k++) v(empty);

v(mutex);

}

}

//////////////////////////红客/////////////////

class Red extends PVableThread

{

public run()

{

while(true)

{p(mutex);

if((rc==0&&bc==3)││(rc==2&&bc==1))

{ t++;

v(mutex);

p(s); //release it till backing

}

else

{v(mutex);

break;

}

}

p(empty); //no more 4 enter,release after backing

System.out.println("RED get on board");

p(mutex);

rc++;

i=i+1;

if(rc+bc==4) v(sail);

v(mutex);

p( go );

System.out.println("RED sailing ");

System.out.println("RED landing ");

p(mutex);

rc--;

v( land );

v(mutex);

}

}

引用DreamPKU上的解法,个人认为如果YAPI的改一下则更好些

对同步与互斥的分析:

同步关系:1. 满员才能开船;2. 红黑客满足一定的组合规则,才能有四人上船互斥关系:红黑客对请求上船的控制

显然,此题难点在对同步关系的解决。

下面给出所写程序的算法思想:

Red():每个红客到来请求上船时执行该程序;

1.请求进入临界区;

2.首先检查本人的到来是否满足上船的组合(即4个红客或2个红客与2个黑客);

3.如果满足2个红客和2和黑客的组合,则看是否有船可上,有的话该红客上船并通知另外1个红客和2个黑客上船,然后通知船满员,并退出临界区;

4.如果满足4个红客的组合,则看是否有船可上,有的话该红客上船并通知另外3个红客上船,然后通知船满员,并退出临界区;

5.不符合上船的组合,则先退出临界区,然后在信号量S_red上等待,直到当条件满足时,有人通知其上船。

6.完毕。

Black():每个黑客到来请求上船时执行该程序,其算法与Red()完全一致;

Boat():河上的船执行该程序;

1.等待满员后开船过河;

2.空船返回,通知可以上船了,转而执行1。

相关文档
最新文档