📄 elevator_stop.cc
字号:
#include"Elevator.h"#include <malloc.h>Elevator::Elevator(char *debugName,int numFloors,int myID){ int i; name = debugName; numfloors = numFloors; currentfloor = 1; elevstate = STOP; occupancy = 0; elevID = myID; fullnum = 10; dstfloor = new int[numfloors+1]; elevlock = new Lock("elevtor lock"); elevcond =(Condition **)malloc(sizeof(Condition*)*(numfloors+1)); for(i=1;i<=numfloors;i++) elevcond[i] = new Condition("elevtor condition");/* upbarrier =(EventBarrier**)malloc(sizeof(EventBarrier*)*(numfloors+1)); for(i=1;i<=numfloors;i++) upbarrier[i] = new EventBarrier("up barrier"); downbarrier=(EventBarrier**)malloc(sizeof(EventBarrier*)*(numfloors+1)); for(i=1;i<=numfloors;i++) downbarrier[i] = new EventBarrier("down barrier"); wait=(EventBarrier**)malloc(sizeof(EventBarrier*)*(numfloors+1)); for(i=1;i<=numfloors;i++) wait[i]=new EventBarrier("wait");*/}Elevator::~Elevator(){ delete dstfloor; delete elevlock; delete elevcond;} voidElevator::OpenDoors(){ elevlock->Acquire(); elevcond[currentfloor]->Broadcast(elevlock); elevlock->Release(); if(elevstate == UP){ printf("before signal.\n"); upbarrier[currentfloor]->Signal(); /*if((upbarrier[currentfloor]->Waiters())==0) currentThread->Yield();*/ printf("signal after.\n"); } else if(elevstate==DOWN){ downbarrier[currentfloor]->Signal(); /*if((downbarrier[currentfloor]->Waiters())==0) currentThread->Yield();*/ } dstfloor[currentfloor] = 0; elevlock->Acquire(); elevcond[currentfloor]->Broadcast(elevlock); elevlock->Release();}voidElevator::CloseDoors(){ /*if(elevstate == UP) upbarrier[currentfloor]->Complete(); else downbarrier[currentfloor]->Complete();*/ if(occupancy==0){ elevstate=STOP; } return;}voidElevator::VisitFloor(int floor){ if(currentfloor<floor) elevstate=UP; else if(currentfloor>floor) elevstate=DOWN; else{ if((occupancy==0)&&(floor==0)) elevstate=STOP; } currentfloor = floor; //wait[floor]->Signal();// OpenDoors();// CloseDoors();}intElevator::NextFloor(){ int u1,u2,d1,d2,i,j,result; while(1){ u1=currentfloor; d2=currentfloor; i=currentfloor; j=currentfloor; u2=1; d1=numfloors; result=0; /*if(elevstate==STOP){ conwait->Acquire(); printf("no request,elevator stop.\n"); wait->Wait(conwait); printf("call up or call down happen.\n"); conwait->Release(); }*/ if(occupancy > 0) { while(j <= numfloors && !dstfloor[j++]); while(i >= 1 && !dstfloor[i--]); j--;i++; } else{ j=numfloors+1; i=0; } printf("i==%d,j==%d\n",i,j); while((u1<=numfloors) && !(upbarrier[u1++]->Waiters())); while((u2<=currentfloor) && !(upbarrier[u2++]->Waiters())); while((d1>=currentfloor) && !(downbarrier[d1--]->Waiters())); while((d2>=1) && !(downbarrier[d2--]->Waiters())); printf("u1=%d,u2=%d,d1=%d,d2=%d\n",u1,u2,d1,d2); printf("elevator %d currentfloor=%d\n",elevID,currentfloor); if(elevstate == UP|| elevstate==STOP ) { if(u1 <= numfloors || j <= numfloors ){ elevstate=UP; u1--; if(occupancy>0){ result= (u1<=j)?u1:j; } else if(u1==10) result= 0; else result= u1; } else if(d1 >= currentfloor) {d1++; elevstate = DOWN; result = d1;} else if(d2 >= 1) {d2++; elevstate = DOWN; result = d2;} else if(u2 <= currentfloor){ u2--; elevstate=UP; result= u2; } } else { if(d2 >= 1 || i >= 1 ){ d2++; elevstate=DOWN; if(occupancy>0) result= (d2>=i)?d2:i; else if(d2==1) result=0; else result=d2; } else if(u2 <= currentfloor) {u2--; elevstate = UP; result= u2;} else if(u1 <= numfloors) {u1--; elevstate = UP; result= u1;} else if(d1 >= currentfloor){ d1++; elevstate=DOWN; result= d1; } } printf("result=%d.\n",result);// if((result==0)&&(elevstate==STOP)){ if(result==0){ conwait->Acquire(); printf("no request,elevator stop.\n"); wait->Wait(conwait); printf("call up or call down happen.\n"); conwait->Release(); } else break; } return result;}boolElevator::Enter(){ if(occupancy < fullnum) { ++occupancy; return true; } else return false;}void Elevator::Exit(){ --occupancy; if(occupancy==0) elevstate = STOP;}voidElevator::RequestFloor(int floor){ dstfloor[floor] = 1; elevlock->Acquire(); elevcond[floor]->Wait(elevlock); printf("rider Request %d return.\n",floor); elevlock->Release();}//////////////////////////////////////////////////////////////////////Building::Building(char *debugname,int numFloors,int numElevators){ name = debugname; numfloors = numFloors; numelevators = numElevators; conwait = new Lock("conwati"); int i; upbarrier =(EventBarrier**)malloc(sizeof(EventBarrier*)*(numfloors+1)); for(i=1;i<=numfloors;i++) upbarrier[i] = new EventBarrier("up barrier"); downbarrier=(EventBarrier**)malloc(sizeof(EventBarrier*)*(numfloors+1)); for(i=1;i<=numfloors;i++) downbarrier[i] = new EventBarrier("down barrier"); /*wait=(Condition**)malloc(sizeof(Condition*)*(numelevators+1)); for(i=1;i<=numelevators;i++) wait[i]=new Condition("wait");*/ wait=new Condition("wait"); elevator=(Elevator **)malloc(sizeof(Elevator*)*(numElevators+1)); for(i=1;i<=numelevators;++i) { elevator[i]= new Elevator("elevator",numfloors,i); elevator[i]->init(upbarrier,downbarrier,wait,conwait); }}Building::~Building(){ delete upbarrier; delete downbarrier; delete elevator;}voidBuilding::CallUp(int fromFloor){ while(1){ for(int i=1;i<=numelevators;i++) if((elevator[i]->GetState())==STOP){ // elevator[i]->SetState(UP); conwait->Acquire(); wait->Broadcast(conwait); conwait->Release(); return; } currentThread->Yield(); }// upbarrier[fromFloor]->Wait();}voidBuilding::CallDown(int fromFloor){ while(1){ for(int i=1;i<=numelevators;i++) if((elevator[i]->GetState())==STOP){ // elevator[i]->SetState(DOWN); conwait->Acquire(); wait->Broadcast(conwait);//elevator i start conwait->Release(); return; } currentThread->Yield(); } //downbarrier[fromFloor]->Wait();}Elevator*Building::AwaitUp(int fromFloor){ int i; upbarrier[fromFloor]->Wait(); //wait[fromFloor]->Wait(); for(i=1;i<=numelevators;i++) if(elevator[i]->GetCurrentFloor()==fromFloor&&elevator[i]->GetState()==UP){ //elevator[i]->SetState(UP); return elevator[i]; } return NULL;}Elevator*Building::AwaitDown(int fromFloor){ int i; downbarrier[fromFloor]->Wait(); //wait[fromFloor]->Wait(); for(i=1;i<=numelevators;i++) if(elevator[i]->GetCurrentFloor()==fromFloor&&elevator[i]->GetState()==DOWN){ //elevator[i]->SetState(DOWN); return elevator[i]; } return NULL;}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -