include [HTML_REMOVED]
include [HTML_REMOVED]
include [HTML_REMOVED]
sem_t mutex;
sem_t door_opened;
sem_t all_students_left;
void Student(void i) {
int id = (int)i;
printf(“Student %d is entering …\n”, id);
// 学生进入图书馆
sem_wait(&mutex); // 申请访问权
sem_post(&door_opened); // 通知管理员门已经打开
sem_wait(&all_students_left); // 等待所有学生离开
sem_post(&mutex); // 释放访问权
printf(“Student %d is leaving.\n”, id);
pthread_exit(NULL);
}
void Manager(void arg) {
printf(“Manager is waiting for the door to be opened.\n”);
sem_wait(&door_opened); // 等待门打开
printf(“Manager open door.\n”);
sem_post(&all_students_left); // 通知所有学生可以离开
pthread_exit(NULL);
}
int main() {
pthread_t students[5];
pthread_t manager;
sem_init(&mutex, 0, 1);
sem_init(&door_opened, 0, 0);
sem_init(&all_students_left, 0, 0);
for (int i = 0; i < 5; i++) {
pthread_create(&students[i], NULL, Student, (void*)(intptr_t)i);
}
pthread_create(&manager, NULL, Manager, NULL);
for (int i = 0; i < 5; i++) {
pthread_join(students[i], NULL);
}
pthread_join(manager, NULL);
sem_destroy(&mutex);
sem_destroy(&door_opened);
sem_destroy(&all_students_left);
return 0;
}