#include<stdio.h>
#include<string.h>
#include<pthread.h>
#include<unistd.h>
#include<semaphore.h>
sem_t ta,student;
pthread_mutex_t mutex;
int waiting = 0;
void* teaching(void *value);
void* consulting(void *value);
void* teaching(void *value){
while(1){
sem_wait(&student);
pthread_mutex_lock(&mutex);
waiting--;
pthread_mutex_unlock(&mutex);
printf("ta is teaching\n");
sleep(5);
sem_post(&ta);
printf("ta is sleeping\n");
}
}
void* consulting(void *value){
while(1){
pthread_mutex_lock(&mutex);
if(waiting<3){
waiting++;
pthread_mutex_unlock(&mutex);
printf("%lu is waiting for ta\n",pthread_self());
sem_post(&student);
sem_wait(&ta);
printf("%lu is consulting the ta\n",pthread_self());
sleep(5);
printf("consultiation is over\n");
}
else{
pthread_mutex_unlock(&mutex);
printf("No more chairs\n");
printf("%lu is programming\n",pthread_self());
sleep(3);
}
}
}
int main(){
pthread_t amy,bill,carl,daisy,emma,teacher;
sem_init(&ta,0,1);
sem_init(&student,0,0);
pthread_mutex_init(&mutex,NULL);
pthread_create(&amy,NULL,consulting,NULL);
pthread_create(&bill,NULL,consulting,NULL);
pthread_create(&carl,NULL,consulting,NULL);
pthread_create(&daisy,NULL,consulting,NULL);
pthread_create(&emma,NULL,consulting,NULL);
pthread_create(&teacher,NULL,teaching,NULL);
pthread_join(amy,NULL);
pthread_join(bill,NULL);
pthread_join(carl,NULL);
pthread_join(daisy,NULL);
pthread_join(emma,NULL);
pthread_join(teacher,NULL);
return 0;
}
运行结果