Untitled
unknown
plain_text
a year ago
2.3 kB
4
Indexable
#include <pthread.h> #include <stdio.h> #include <stdlib.h> #include <semaphore.h> #define MAX_STUDENTS 100 int num_students; int num_glasses; int glasses_available; pthread_mutex_t mutex; sem_t glasses_semaphore; typedef struct { int id; char status[20]; // Watching, Finished, Waiting } Student; Student students[MAX_STUDENTS]; void print_student_status() { printf("\n%-12s%-16s\n", "Student No", "Status"); for (int i = 0; i < num_students; ++i) { printf("%-12d%-16s\n", students[i].id, students[i].status); } } void *student_thread(void *arg) { int student_id = *(int *)arg; // Wait for available 3D glasses sem_wait(&glasses_semaphore); pthread_mutex_lock(&mutex); glasses_available--; if (students_watching < num_glasses) { students[student_id].id = student_id; sprintf(students[student_id].status, "Watching"); students_watching++; } else { sprintf(students[student_id].status, "Waiting"); students_waiting++; } pthread_mutex_unlock(&mutex); // Simulate watching the movie sleep(2); pthread_mutex_lock(&mutex); if (students[student_id].status == "Watching") { students_watching--; glasses_available++; sprintf(students[student_id].status, "Finished"); } else { students_waiting--; sprintf(students[student_id].status, "Finished (Not Watched)"); } // Release 3D glasses sem_post(&glasses_semaphore); pthread_mutex_unlock(&mutex); print_student_status(); pthread_exit(NULL); } int main() { printf("Enter the number of students: "); scanf("%d", &num_students); printf("Enter the number of 3D glasses: "); scanf("%d", &num_glasses); glasses_available = num_glasses; pthread_t student_threads[MAX_STUDENTS]; int student_ids[MAX_STUDENTS]; pthread_mutex_init(&mutex, NULL); sem_init(&glasses_semaphore, 0, num_glasses); for (int i = 0; i < num_students; ++i) { student_ids[i] = i; pthread_create(&student_threads[i], NULL, student_thread, (void *)&student_ids[i]); } for (int i = 0; i < num_students; ++i) { pthread_join(student_threads[i], NULL); } pthread_mutex_destroy(&mutex); sem_destroy(&glasses_semaphore); return 0; }
Editor is loading...
Leave a Comment