⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 elevator_me.cc

📁 linux的例子,就是下载后到自己的机子上去运行
💻 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 + -