📄 elevator_me.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 = 20; 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");}Elevator::~Elevator(){ delete dstfloor; delete elevlock; delete elevcond;} voidElevator::OpenDoors(){ elevlock->Acquire(); elevcond[currentfloor]->Broadcast(elevlock); elevlock->Release(); if(elevstate == UP) { (*people)=(*people)-upbarrier[currentfloor]->Waiters(); upbarrier[currentfloor]->Signal(); } else if(elevstate==DOWN) { (*people)=(*people)-downbarrier[currentfloor]->Waiters(); downbarrier[currentfloor]->Signal(); } dstfloor[currentfloor] = 0; elevlock->Acquire(); elevcond[currentfloor]->Broadcast(elevlock); elevlock->Release();}voidElevator::CloseDoors(){ 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;}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(occupancy > 0) { while(j <= numfloors && !dstfloor[j++]); while(i >= 1 && !dstfloor[i--]); j--;i++; } else{ j=numfloors+1; i=0; } 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("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; } } if(result==0){ printf("elevator %d stop at floor %d.\n",elevID,currentfloor); while(1) { wait->P(); if((*people)>0) break; } printf("elevator %d start.\n",elevID); } 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); elevlock->Release();}//////////////////////////////////////////////////////////////////////Building::Building(char *debugname,int numFloors,int numElevators){ name = debugname; numfloors = numFloors; numelevators = numElevators; 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 = new Semaphore("wait",0); 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,&people); }}Building::~Building(){ delete upbarrier; delete downbarrier; delete elevator;}voidBuilding::CallUp(int fromFloor){ ++people; wait->V();}voidBuilding::CallDown(int fromFloor){ ++people; wait->V();}Elevator*Building::AwaitUp(int fromFloor){ int i; upbarrier[fromFloor]->Wait(); for(i=1;i<=numelevators;i++) if(elevator[i]->GetCurrentFloor()==fromFloor&&elevator[i]->GetState()==UP) return elevator[i]; return NULL;}Elevator*Building::AwaitDown(int fromFloor){ int i; downbarrier[fromFloor]->Wait(); for(i=1;i<=numelevators;i++) if(elevator[i]->GetCurrentFloor()==fromFloor&&elevator[i]->GetState()==DOWN) return elevator[i]; return NULL;}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -