红黑客问题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 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。