C语言编程:使用threads ,先创建N个学生,每个线程都将作为一个单独的线程运行。TA也将作为一个单独的线程运行。学生线程将要在寻求帮助和编程之间交替一段时间。如果TA可用,他们将获得帮助,否则就需要在走廊的椅子上面等待,并稍后寻求帮助。如果学生走进办公室寻求帮助发现TA正在睡觉,学生必须使用信号灯通知TA,帮助教帮助完学生后,助教必须检查走廊里是否有学生还需要帮助。如果没有学生需要帮助,助教TA可以继续打盹。模拟TA帮助学生的过程为sleep()走廊上只有三把椅子。
时间: 2024-03-04 10:47:59 浏览: 61
C# 线程thread 教程
以下是使用 C 语言实现的一个简单示例,实现了上述要求:
```c
#include <stdio.h>
#include <stdlib.h>
#include <pthread.h>
#include <semaphore.h>
#include <unistd.h>
#define NUM_STUDENTS 5
#define NUM_CHAIRS 3
sem_t mutex;
sem_t students;
sem_t chairs;
int num_waiting = 0;
int ta_sleeping = 1;
void *student(void *arg) {
int id = *(int *)arg;
while (1) {
// Try to get a chair
sem_wait(&chairs);
printf("Student %d is waiting.\n", id);
// Try to wake up TA
sem_wait(&mutex);
if (ta_sleeping) {
ta_sleeping = 0;
printf("Student %d wakes up TA.\n", id);
sem_post(&students);
sem_post(&mutex);
// Wait for TA's help
sem_wait(&mutex);
ta_sleeping = 1;
printf("Student %d finishes help.\n", id);
// Check if there are any other students waiting
if (num_waiting == 0) {
sem_post(&mutex);
break;
}
num_waiting--;
sem_post(&mutex);
} else {
num_waiting++;
sem_post(&mutex);
sem_wait(&students);
}
// Leave the chair
sem_post(&chairs);
// Do some programming
sleep(rand() % 5);
}
pthread_exit(NULL);
}
void *ta(void *arg) {
while (1) {
// Check if there are any students waiting
sem_wait(&mutex);
if (num_waiting == 0) {
sem_post(&mutex);
printf("TA goes to sleep.\n");
// Sleep for a random time
sleep(rand() % 5);
continue;
}
num_waiting--;
sem_post(&mutex);
// Help the student
printf("TA is helping a student.\n");
sleep(rand() % 5);
printf("TA finishes help.\n");
sem_post(&students);
}
pthread_exit(NULL);
}
int main() {
// Initialize semaphores
sem_init(&mutex, 0, 1);
sem_init(&students, 0, 0);
sem_init(&chairs, 0, NUM_CHAIRS);
// Create student threads
pthread_t student_threads[NUM_STUDENTS];
int student_ids[NUM_STUDENTS];
for (int i = 0; i < NUM_STUDENTS; i++) {
student_ids[i] = i + 1;
pthread_create(&student_threads[i], NULL, student, &student_ids[i]);
}
// Create TA thread
pthread_t ta_thread;
pthread_create(&ta_thread, NULL, ta, NULL);
// Wait for all threads to finish
for (int i = 0; i < NUM_STUDENTS; i++) {
pthread_join(student_threads[i], NULL);
}
pthread_join(ta_thread, NULL);
// Destroy semaphores
sem_destroy(&mutex);
sem_destroy(&students);
sem_destroy(&chairs);
return 0;
}
```
在主函数中,我们首先初始化了三个信号量 `mutex`、`students`、`chairs`,并创建了 `NUM_STUDENTS` 个学生线程和一个 TA 线程。每个学生线程和 TA 线程都会执行对应的函数 `student` 和 `ta`。
在 `student` 函数中,每个学生会循环执行以下操作:
1. 尝试获取一把椅子(使用 `sem_wait` 函数)。
2. 尝试使用 `mutex` 信号量锁住 TA 的状态。
3. 如果 TA 正在睡觉,唤醒 TA 并释放 `students` 信号量,然后等待 TA 的帮助(使用 `sem_wait` 函数)。
4. 如果 TA 正在忙,将自己的等待人数加一,并释放 `mutex` 信号量,然后等待 `students` 信号量(使用 `sem_wait` 函数)。
5. 在离开椅子之前进行一些编程工作(使用 `sleep` 函数)。
在 `ta` 函数中,TA 会循环执行以下操作:
1. 检查是否有学生需要帮助。
2. 如果没有,进入睡眠状态(使用 `sleep` 函数)。
3. 如果有,从等待队列中选择一个学生,并进行帮助(使用 `sem_wait` 函数和 `sem_post` 函数)。
最后,我们在主函数中等待所有线程执行完毕,并销毁信号量。
阅读全文