📄 elevator_me.h
字号:
/*
Here are the method signatures for the Elevator and Building classes.
You should feel free to add to these classes, but do not change the
existing interfaces.
*/
#include"EventBarrier.h"
#include"synch-sleep.h"
#include "thread.h"
#include "system.h"
typedef enum{UP,DOWN,STOP}ElevSTATE;
class Elevator {
public:
Elevator(char *debugName, int numFloors, int myID);
~Elevator();
char *getName() { return name; }
// elevator control interface: called by Elevator thread
void OpenDoors(); // signal exiters and enterers to action
void CloseDoors(); // after exiters are out and enterers are in
void VisitFloor(int floor); // go to a particular floor
// elevator rider interface (part 1): called by rider threads.
bool Enter(); // get in
void Exit(); // get out (iff destinationFloor)
void RequestFloor(int floor); // tell the elevator our destinationFloor
// insert your methods here, if needed
void init(EventBarrier **barrier1,EventBarrier **barrier2,Semaphore *w,int *p){
upbarrier = barrier1;
downbarrier = barrier2;
wait=w;
people = p;
}
int NextFloor();
int GetID(){return elevID;}
int GetCurrentFloor(){return currentfloor;}
int GetCurrentOccu(){return occupancy;}
void SetState(ElevSTATE s){elevstate=s;}
ElevSTATE GetState(){return elevstate;}
private:
char *name;
int currentfloor; // floor where currently stopped
int occupancy; // how many riders currently onboard
// insert your data structures here, if needed
int numfloors;
int elevID;
int fullnum;
int *dstfloor;
int *people;
Lock *elevlock;
Condition **elevcond;
ElevSTATE elevstate;
EventBarrier **upbarrier;
EventBarrier **downbarrier;
Semaphore *wait;
};
class Building {
public:
Building(char *debugname, int numFloors, int numElevators);
~Building();
char *getName() { return name; }
// elevator rider interface (part 2): called by rider threads
void CallUp(int fromFloor); // signal an elevator we want to go up
void CallDown(int fromFloor); // ... down
Elevator *AwaitUp(int fromFloor); // wait for elevator arrival & going up
Elevator *AwaitDown(int fromFloor); // ... down
Elevator *GetElevator(int id){return elevator[id];}
int GetElevatorNum(){return numelevators;}
private:
char *name;
Elevator **elevator; // the elevators in the building (array)
// insert your data structures here, if needed
int numelevators;
int numfloors;
int people;
EventBarrier **upbarrier;
EventBarrier **downbarrier;
Semaphore *wait;
};
// here's a sample portion of a rider thread body showing how we
// expect things to be called.
//
// void rider(int id, int srcFloor, int dstFloor) {
// Elevator *e;
//
// if (srcFloor == dstFloor)
// return;
//
// DEBUG('t',"Rider %d travelling from %d to %d\n",id,srcFloor,dstFloor);
// do {
// if (srcFloor < dstFloor) {
// DEBUG('t', "Rider %d CallUp(%d)\n", id, srcFloor);
// building->CallUp(srcFloor);
// DEBUG('t', "Rider %d AwaitUp(%d)\n", id, srcFloor);
// e = building->AwaitUp(srcFloor);
// } else {
// DEBUG('t', "Rider %d CallDown(%d)\n", id, srcFloor);
// building->CallDown(srcFloor);
// DEBUG('t', "Rider %d AwaitDown(%d)\n", id, srcFloor);
// e = building->AwaitDown(srcFloor);
// }
// DEBUG('t', "Rider %d Enter()\n", id);
// } while (!e->Enter()); // elevator might be full!
//
// DEBUG('t', "Rider %d RequestFloor(%d)\n", id, dstFloor);
// e->RequestFloor(dstFloor); // doesn't return until arrival
// DEBUG('t', "Rider %d Exit()\n", id);
// e->Exit();
// DEBUG('t', "Rider %d finished\n", id);
// }
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -