I'm creating simulation of a train station. Train information is read from a file. Each line of the file represents a train and each train gets its own thread. The main track of the train station can only hold 1 train at a time. Here is my code:
#include <stdio.h>
#include <stdlib.h>
#include <pthread.h>
#include <string.h>
#include <readline/readline.h>
#include <unistd.h>
pthread_mutex_t main_track_mutex = PTHREAD_MUTEX_INITIALIZER;
pthread_cond_t  main_track_condition_var = PTHREAD_COND_INITIALIZER;
int main_track_status = 0;
void *train_function(void *args) {
    /* Parse train information */
    int line_number = atoi(strtok(args, ":,"));
    char *priority_direction = strtok(NULL,":,");
    int loading_time = atoi(strtok(NULL, ":,"));
    int crossing_time = atoi(strtok(NULL, ":,"));
    /* Load train */
    sleep(loading_time/10);
    printf("Train %d is ready to go %s\n",line_number,priority_direction);
    /* If the main track is currently in use, wait for it to become available */
    while(main_track_status)
        pthread_cond_wait(&main_track_condition_var, &main_track_mutex);
    /* Use the main track */
    pthread_mutex_lock(&main_track_mutex);
    main_track_status = 1;
    printf("Train %d is ON the main track going %s\n",line_number,priority_direction);
    sleep(crossing_time/10);
    main_track_status = 0;
    /* Notify other trains main track is empty */
    pthread_mutex_unlock(&main_track_mutex);
    pthread_cond_signal(&main_track_condition_var);
    printf("Train %d is OFF the main track after going %s\n",line_number,priority_direction);
    pthread_exit(0);
}
int main() {
    FILE *ptr_file;
    char buff[10];
    int train_count = 0;
    char *train;
    char line[15];
    pthread_t trains[3];
    ptr_file = fopen("./trains.txt", "r");
    if (!ptr_file) 
    {
        perror("fopen for trains.txt failed");
        exit(EXIT_FAILURE);
    }
    /* Create train for each line of file */
    while (fgets(buff,10, ptr_file)!=NULL) {
        train = (char*)malloc(10 * sizeof(char));
        /* Include line number from file in train information */
        sprintf(line, "%d:", train_count);  
        strcat(line, buff);
        strcpy(train, line);
        if(pthread_create(&trains[train_count], NULL, &train_function, (void *) train))
        {
            perror("pthread create failed");
            exit(EXIT_FAILURE);
        }
        train_count++;
    }
    fclose(ptr_file);
    /* Wait for all trains to leave the station */
    for (int x = 0; x < train_count; x++) {
        pthread_join(trains[x], NULL);
    }
    free(train);
    exit(EXIT_SUCCESS);
}
The trains input file:
e:10,6
W:5,7
E:3,10
The output of the program is:
Train 1 is ready to go W
Train 1 is ON the main track going W
Train 1 is OFF the main track after going W
Train 2 is ready to go E
Train 2 is ON the main track going E
Train 0 is ready to go e
Train 2 is OFF the main track after going E
I think my error lies in the train_function. As you can see, train 0 never gets access to the main track. I must be misunderstanding how threads are awoken with condition variables and am getting stuck in a deadlock. What am I missing?
 
    