📄 barber.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 + -