Untitled
unknown
plain_text
2 years ago
3.9 kB
4
Indexable
##include <stdio.h>
#include <stdlib.h>
#include <pthread.h>
#include <semaphore.h>
#include <unistd.h>
// Global variables
int num_students;
int num_glasses;
int glasses_available = 0;
int students_waiting = 0;
int students_finished = 0;
pthread_mutex_t mutex;
sem_t student_sem;
sem_t coordinator_sem;
// Function prototypes
void* student_thread(void* arg);
void* coordinator_thread(void* arg);
int main(int argc, char* argv[]) {
if (argc != 3) {
fprintf(stderr, "Usage: %s <total_students> <total_glasses>\n", argv[0]);
return 1;
}
num_students = atoi(argv[1]);
num_glasses = atoi(argv[2]);
pthread_mutex_init(&mutex, NULL);
sem_init(&student_sem, 0, 0);
sem_init(&coordinator_sem, 0, 1);
pthread_t coordinator;
pthread_t* student_threads = (pthread_t*)malloc(num_students * sizeof(pthread_t));
// Create coordinator thread
pthread_create(&coordinator, NULL, coordinator_thread, NULL);
// Create student threads
for (int i = 0; i < num_students; i++) {
pthread_create(&student_threads[i], NULL, student_thread, (void*)(long)i);
}
// Join coordinator thread
pthread_join(coordinator, NULL);
// Join student threads
for (int i = 0; i < num_students; i++) {
pthread_join(student_threads[i], NULL);
}
// Clean up resources
free(student_threads);
pthread_mutex_destroy(&mutex);
sem_destroy(&student_sem);
sem_destroy(&coordinator_sem);
printf("All students have finished watching the movie.\n");
return 0;
}
void* student_thread(void* arg) {
int student_id = (int)(long)arg;
printf("Student %d is waiting for 3D glasses.\n", student_id);
sem_wait(&coordinator_sem); // Request permission from the coordinator
pthread_mutex_lock(&mutex); // Lock the mutex
if (glasses_available > 0) {
// If 3D glasses are available, take one
glasses_available--;
printf("Student %d is watching the 3D movie with glasses. Glasses available: %d\n", student_id, glasses_available);
pthread_mutex_unlock(&mutex); // Unlock the mutex
} else {
// If no 3D glasses are available, wait
students_waiting++;
pthread_mutex_unlock(&mutex); // Unlock the mutex
sem_post(&student_sem); // Signal the coordinator that a student is waiting
sem_wait(&coordinator_sem); // Wait for the coordinator's signal
// Student has been signaled by the coordinator, indicating glasses are available
pthread_mutex_lock(&mutex); // Lock the mutex
students_waiting--;
glasses_available--;
printf("Student %d is watching the 3D movie with glasses. Glasses available: %d\n", student_id, glasses_available);
pthread_mutex_unlock(&mutex); // Unlock the mutex
}
// Simulate watching the movie (you can replace this with actual movie-watching code)
sleep(5);
pthread_mutex_lock(&mutex); // Lock the mutex
glasses_available++; // Return the 3D glasses
printf("Student %d returned the 3D glasses. Glasses available: %d\n", student_id, glasses_available);
students_finished++;
pthread_mutex_unlock(&mutex); // Unlock the mutex
if (students_finished == num_students) {
sem_post(&student_sem); // Signal coordinator that all students have finished
}
pthread_exit(NULL);
}
void* coordinator_thread(void* arg) {
while (1) {
sem_wait(&student_sem); // Wait for a student to signal
pthread_mutex_lock(&mutex); // Lock the mutex
if (students_waiting > 0) {
// If there are waiting students, signal one of them
sem_post(&coordinator_sem);
}
pthread_mutex_unlock(&mutex); // Unlock the mutex
if (students_finished == num_students) {
// All students have finished, terminate coordinator
pthread_exit(NULL);
}
}
}
Editor is loading...
Leave a Comment