/*Ivan Djordjevic 2023*/ #include #include #include #include #define BROJ_KOLA 10 enum postojeceTrake {TRAKA_0, TRAKA_1, TRAKA_2, TRAKA_3}; enum postojecaSkretanja {PRAVO, LEVO, DESNO}; pthread_mutex_t trakeLock; pthread_cond_t trakaCond; int trakeCekaju[4] = {0, 0, 0, 0}; int trakeProlaze[4] = {0, 0, 0, 0}; void printfCekanje(long id, int traka, int smer){ if(smer == 0) printf("\nCEKA - Vozilo %ld ceka na traci %d da bi islo pravo.\n", id, traka); else if(smer == 1) printf("\nCEKA - Vozilo %ld ceka na traci %d da bi islo levo.\n", id, traka); else if(smer == 2) printf("\nCEKA - Vozilo %ld ceka na traci %d da bi islo desno.\n", id, traka); else printf("\nNesto NIJE OK kod cekanja!\n"); } void* vozi(void* arg){ long id = (long) arg; int traka = rand() % 4; int smer = rand() % 3; sleep(rand() % 10); printfCekanje(id, traka, smer); trakeCekaju[traka]++; // PRAVO if(smer == 0){ pthread_mutex_lock(&trakeLock); while(trakeProlaze[traka] > 0 || trakeProlaze[(traka + 3) % 4] > 0 || trakeProlaze[(traka + 1) % 4] > 0 || trakeCekaju[(traka + 1) % 4] > 0) pthread_cond_wait(&trakaCond, &trakeLock); trakeCekaju[traka]--; trakeProlaze[traka]++; pthread_mutex_unlock(&trakeLock); // PROLAZIMO printf("\n\tVozilo %ld polazi iz trake %d i ide pravo...\n", id, traka); sleep(1); printf("\n\t\tVozilo %ld je preslo...\n", id); pthread_mutex_lock(&trakeLock); trakeProlaze[traka]--; pthread_cond_broadcast(&trakaCond); pthread_mutex_unlock(&trakeLock); } else // LEVO if(smer == 1){ pthread_mutex_lock(&trakeLock); while(trakeProlaze[0] > 0 || trakeProlaze[1] > 0 || trakeProlaze[2] > 0 || trakeProlaze[3] > 0 || trakeCekaju[(traka + 1) % 4] > 0) pthread_cond_wait(&trakaCond, &trakeLock); trakeCekaju[traka]--; trakeProlaze[traka]++; pthread_mutex_unlock(&trakeLock); // PROLAZIMO printf("\n\tVozilo %ld polazi iz trake %d i ide levo...\n", id, traka); sleep(1); printf("\n\t\tVozilo %ld je preslo...\n", id); pthread_mutex_lock(&trakeLock); trakeProlaze[traka]--; pthread_cond_broadcast(&trakaCond); pthread_mutex_unlock(&trakeLock); } else // DESNO if(smer == 2){ pthread_mutex_lock(&trakeLock); while(trakeProlaze[traka] > 0 || trakeProlaze[(traka + 3) % 4] > 0) pthread_cond_wait(&trakaCond, &trakeLock); trakeCekaju[traka]--; trakeProlaze[traka]++; pthread_mutex_unlock(&trakeLock); // PROLAZIMO printf("\n\tVozilo %ld polazi iz trake %d i ide desno...\n", id, traka); sleep(1); printf("\n\t\tVozilo %ld je preslo...\n", id); pthread_mutex_lock(&trakeLock); trakeProlaze[traka]--; pthread_cond_broadcast(&trakaCond); pthread_mutex_unlock(&trakeLock); } } int main(){ pthread_t cars[BROJ_KOLA]; pthread_mutex_init(&trakeLock, NULL); pthread_cond_init(&trakaCond, NULL); for(long i = 0; i < BROJ_KOLA; i++) pthread_create(cars+i, NULL, vozi, (void*)i ); for(long i = 0; i < BROJ_KOLA; i++) pthread_join(cars[i], NULL); pthread_mutex_destroy(&trakeLock); pthread_cond_destroy(&trakaCond); return 0; }