Untitled

 avatar
unknown
plain_text
a year ago
1.5 kB
4
Indexable
#include <stdio.h>
#include <stdlib.h>
#include <pthread.h>
#include <semaphore.h>
#include <unistd.h>

#define NUM_TRAINS 5

sem_t trackSemaphore;

void* train(void* trainID) {
    int id = *((int*)trainID);

    // Simulate arriving at the track
    sleep(rand() % 3);

    printf("Train %d is waiting to enter the track\n", id);

    // Request access to the shared track
    sem_wait(&trackSemaphore);

    printf("Train %d enters the track\n", id);

    // Simulate passing through the track
    sleep(rand() % 3);

    printf("Train %d exits the track\n", id);

    // Release the track for the next train
    sem_post(&trackSemaphore);

    return NULL;
}

void scanFunction() {
    int trainNumber;
    printf("Enter the train number (1 to %d): ", NUM_TRAINS);
    scanf("%d", &trainNumber);

    // Check if the entered train number is valid
    if (trainNumber >= 1 && trainNumber <= NUM_TRAINS) {
        // Create a thread for the scanned train
        pthread_t scanThread;
        pthread_create(&scanThread, NULL, train, (void*)&trainNumber);

        // Wait for the scan thread to finish
        pthread_join(scanThread, NULL);
    } else {
        printf("Invalid train number. Please enter a number between 1 and %d.\n", NUM_TRAINS);
    }
}

int main() {
    srand(time(NULL));

    // Initialize semaphore with initial value 1
    sem_init(&trackSemaphore, 0, 1);

    // Ask the user to scan a train
    scanFunction();

    // Destroy semaphore
    sem_destroy(&trackSemaphore);

    return 0;
}
Editor is loading...
Leave a Comment