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

📄 elevator_stop.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 = 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 + -