校图书馆有10本郁红英主编的《计算机操作系统实验指导书》,校内大二同学都可以借阅。图书管理员每次只能为一名同学办理借阅手续。同学借完书马上离开。请设计程序模拟学生借书过程。要求:用线程模拟学生借书,用信号量保障线程正确工作,注意线程资源回收。用c语言写
时间: 2023-06-12 18:07:49 浏览: 112
计算机学院操作系统实验指导书
以下是一个基于信号量的C语言程序,模拟了学生借书的过程。
```c
#include <stdio.h>
#include <stdlib.h>
#include <pthread.h>
#include <semaphore.h>
#define MAX_BOOKS 10 // 图书馆最大书籍数量
#define MAX_STUDENTS 100 // 最大学生数量
int num_books = MAX_BOOKS; // 图书馆当前书籍数量
sem_t sem_books; // 信号量,表示图书馆中可借阅的书籍数量
void *borrow_book(void *args) {
int student_id = *(int *)args;
printf("Student %d is trying to borrow a book...\n", student_id);
sem_wait(&sem_books); // 申请信号量
if (num_books > 0) {
num_books--;
printf("Student %d has borrowed a book. %d books left in the library.\n", student_id, num_books);
} else {
printf("Student %d failed to borrow a book. No books left in the library.\n", student_id);
}
sem_post(&sem_books); // 释放信号量
pthread_exit(NULL);
}
int main() {
sem_init(&sem_books, 0, MAX_BOOKS); // 初始化信号量
pthread_t students[MAX_STUDENTS];
int student_ids[MAX_STUDENTS];
for (int i = 0; i < MAX_STUDENTS; i++) {
student_ids[i] = i + 1;
pthread_create(&students[i], NULL, borrow_book, &student_ids[i]);
}
for (int i = 0; i < MAX_STUDENTS; i++) {
pthread_join(students[i], NULL);
}
sem_destroy(&sem_books); // 销毁信号量
return 0;
}
```
程序中,我们使用了一个全局变量`num_books`来表示图书馆中可借阅的书籍数量,并使用了一个信号量`sem_books`来保护这个变量,以避免多个线程同时修改它的值。
在`borrow_book`函数中,每个线程会申请信号量,如果信号量的值大于0(即图书馆中还有书籍),则该线程可以借阅一本书,否则无法借书。无论是否成功借阅,该线程都会释放信号量。
在`main`函数中,我们创建了一些线程来模拟学生借书的过程。每个线程都会执行`borrow_book`函数,并将自己的学号作为参数传递给该函数。
最后,我们在`main`函数中等待所有线程执行完毕,销毁信号量并退出程序。
阅读全文