include [HTML_REMOVED]
include [HTML_REMOVED]
include [HTML_REMOVED]
include [HTML_REMOVED]
include [HTML_REMOVED] // 添加此头文件
define N 5 // 最多允许进入的学生数量
define M 10 // 总学生数量
unsigned int ns = 0; // 学生计数
sem_t mutex; // 初始值为1
sem_t wfm; // wait for manager,初始值为0
sem_t wfs; // wait for student,初始值为0
void Student(void i) {
intptr_t id = (intptr_t)i; // 修改为intptr_t类型
printf(“Student %ld is entering…\n”, id); // 修改为%ld
sem_wait(&mutex);
ns++;
if (ns == 1) {
sem_wait(&wfm);
printf(“The 1st student entered.\n”);
}
sem_post(&mutex);
printf(“Student %ld has been entered.\n”, id); // 修改为%ld
printf(“Student %ld is reading…\n”, id); // 修改为%ld
// 可以用sleep(rand)实现,rand为[1,10]秒随机数
sleep(rand() % 10 + 1);
printf(“Student %ld is going to leave…\n”, id); // 修改为%ld
sem_wait(&mutex);
ns–;
printf(“Student %ld has left.\n”, id); // 修改为%ld
if (ns == 0) {
sem_post(&wfs);
printf(“The last student left.\n”);
}
sem_post(&mutex);
pthread_exit(NULL);
}
void *Manager() {
printf(“Manager is waiting for all students to leave.\n”);
sem_wait(&wfs);
printf(“Manager is closing the door.\n”);
sem_post(&wfm);
pthread_exit(NULL);
}
int main() {
// 初始化信号量
sem_init(&mutex, 0, 1);
sem_init(&wfm, 0, 0);
sem_init(&wfs, 0, 0);
// 创建M(M>N)个学生线程
pthread_t students[M];
for (intptr_t i = 0; i < M; i++) { // 修改为intptr_t类型
pthread_create(&students[i], NULL, Student, (void *)i);
}
// 创建管理员线程
pthread_t manager;
pthread_create(&manager, NULL, Manager, NULL);
// 等待所有学生线程结束
for (intptr_t i = 0; i < M; i++) { // 修改为intptr_t类型
pthread_join(students[i], NULL);
}
// 等待管理员线程结束
pthread_join(manager, NULL);
// 销毁信号量
sem_destroy(&mutex);
sem_destroy(&wfm);
sem_destroy(&wfs);
pthread_exit(NULL);
}
liang@liang-VirtualBox:~$ make
make: *** No rule to make target ‘main.c’, needed by ‘main.o’. Stop.
liang@liang-VirtualBox:~$ make
Makefile:7: *** missing separator. Stop.
CC = gcc CFLAGS = -Wall -Wextra -pthread
all: program
program: main.o $(CC) $(CFLAGS) -o program main.o
main.o: main.c $(CC) $(CFLAGS) -c main.c
clean: rm -rf *.o program