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

📄 barber.c~

📁 这是一个操作系统课程中的理发师算法。具体描述见readme
💻 C~
字号:
#include <stdio.h>#include <pthread.h>#include <unistd.h>#include <signal.h>#include <semaphore.h>#include <sys/ipc.h>#include <sys/sem.h>#define NUMOFCHAIRS 	20		#define NUMOFBARBERS 	2sem_t chairs;				//semphore for chairssem_t hairs;				//semphore for hairs to cut.sem_t barber_mutex;			sem_t customer_mutex;sem_t mainthread_quit;		//mutex for main thread to quitint index_in;				//index of next customer's seat.int index_out;				//index of next customer to servicechar seat[NUMOFCHAIRS ];			char barber_seat[NUMOFBARBERS];int over = 0;				//Stop the program.int service = 1;void snapshot();				void init();void * Barber(void * param);void * Customer( void * param);void CustomerSitDownWaiting(int number);void BarberWorking(int number);void BarberChating(int number);void InviteCustomerComeIn(int number);// The function is to decrease the running time.void mysleep(int time){	int real = time*1000/2;	usleep(real);		sleep(time);}//Customers sit down to wait.void CustomerSitDownWaiting(int number){	printf("Customer%d sit down on chair%d\n",number,index_in);	sem_wait(&customer_mutex);	seat[index_in] = 1;	index_in++;	index_in %= NUMOFCHAIRS;	sem_post(&customer_mutex);}// Snapshot for two rooms.void snapshot(){	int i = 0;	printf("\n++++++++++++++Customer Room Status++++++++++++++++\n");		for( i = 0 ; i < NUMOFCHAIRS ; i ++ )	{		if(i != 0)			if( i%5 == 0 )			{				printf("\n");			}			printf("[Seat%d--%s]  ",i,(seat[i]>0?"Occupied":"-"));		//		printf("[Seat%d---%d]  ",i,seat[i]);			}	printf("\n+++++++++++++++++++++++++++++++++++++++++++\n");		printf("******Barber Room Status********\n");		int	j = 0;	for( j = 0 ; j < NUMOFBARBERS ; j ++ )	{		printf("Barber%d-----%s\n", j ,(barber_seat[j]>0?"Busy":"Idle"));//		printf("Barber Seat%d-----%d\n", j ,(barber_seat[j]));	}	printf("*************************\n");}//One barber chats with another.void BarberChatting(int number){	printf("Chat::Hello,barber%d. I am barber%d. I am free.I like chatting. Do you like it?\n",(number+1)%2,number);	mysleep(1);}	//Barber is working.void BarberWorking(int number){	printf("\nNotification: Barber%d is Working..........\n",number);	int time = barbertime(number);				mysleep(time);	barber_seat[number] = 0;	printf("\nNotification: Barber%d finished the work.......\n",number);	}//Barber invites one customer to come in.void InviteCustomerComeIn(int number){	sem_wait(&barber_mutex);	printf("Barber%d invite chair%d Customer ComeIn\n",number, index_out); 	seat[index_out] = 0; 	index_out ++; 	index_out %= NUMOFCHAIRS;	sem_post(&barber_mutex);		barber_seat[number] = 1;}//The function for thread body.void * Barber(void * param){	int i = 0; 	int Number = *(int *)param;	printf("barber %d init ok....\n",Number);	while(!over)		{		if( sem_trywait(&hairs) == 0)		{			InviteCustomerComeIn(Number);					sem_post(&chairs);			BarberWorking(Number);		}		else		{			if(barber_seat[(Number+1)%2] == 1)			{				BarberChatting(Number);									} 			else			{				printf("Barber%d is sleeping. ",Number);				mysleep(1);			}		}			}	sem_post(&mainthread_quit);}//The function for customer thread body.void * Customer( void * param){	printf("customer %d comes in.......\n",*(int*)param);	snapshot();	usleep(100);	if(sem_trywait(&chairs)==0 )	{		CustomerSitDownWaiting(*(int*)param);		sem_post(&hairs);	}	else //no wait and leave the room.	{		printf("No chairs, so customer leave the room....................\n");		exit(0);	}}// Customer enters room.int entertime(int seed){	int return_value;	srand(time(NULL)+seed);	return_value = (rand())%30+1;	printf("\nNotification: the next customer will enter after %d min\n",return_value);		return return_value;}// Randomly to get barber's workig time.int barbertime(int seed){	int return_value;	srand(time(NULL)+seed);	return_value = 	(rand())%11+20;	printf("\nNotification: the barber%d will finish the work after %d min\n",seed,return_value);			return return_value;}//Initialize the semaphores.void init(){	sem_init(&chairs,0,NUMOFCHAIRS);	sem_init(&hairs,0,0);	sem_init(&barber_mutex,0, 1);	sem_init(&customer_mutex,0,1);	sem_init(&mainthread_quit,0,0);		index_in = 0;	index_out = 0; 		memset(seat, 0 ,NUMOFCHAIRS);	memset(barber_seat,0 , NUMOFBARBERS);	printf("init ok!\n");}int main(){	int i = 0;	pthread_t p1,p2;		init();		int number = 0;	pthread_create(&p1,NULL,Barber,&number);	int number1 = 1;	pthread_create(&p2,NULL,Barber,&number1);		pthread_t customer[50];	for( i = 0 ; i < 5 ; i ++)	{		int entrytime = entertime(i);		mysleep(entrytime);		int code = i;		pthread_create(&(customer[i]),NULL,Customer,&code);					}	sleep(3);			over = 1;		//Main thread is waiting for the last customer's hair cut.	printf("main thread is waiting for barber and customer.\n");	sem_wait(&mainthread_quit);	printf("Main thread exits......^_^\n");		return 0;}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -