#include #include #include #include #include struct Automobil { int id; int smjer; }; pthread_mutex_t m = PTHREAD_MUTEX_INITIALIZER; pthread_cond_t j_s = PTHREAD_COND_INITIALIZER; pthread_cond_t s_j = PTHREAD_COND_INITIALIZER; pthread_cond_t *red_a[2] = { &j_s, &s_j }; char *tsmjer[] = { "nigdje", "jug", "sjever" }; int auti_na_mostu = 0; int smjer_na_mostu = -1; //0: jug->sjever; 1:sjever->jug; -1:nikoga na mostu void *novi_auto (void *p) { struct Automobil *Auto = p; pthread_mutex_lock(&m); while (auti_na_mostu > 2 || (smjer_na_mostu != -1 && smjer_na_mostu != Auto->smjer)) pthread_cond_wait(red_a[Auto->smjer], &m); auti_na_mostu++; smjer_na_mostu = Auto->smjer; printf("Auto %2d na mostu, ide na %s (na mostu %d, idu na %s)\n", Auto->id, tsmjer[Auto->smjer], auti_na_mostu, tsmjer[smjer_na_mostu + 1]); pthread_mutex_unlock(&m); usleep(5000000); pthread_mutex_lock(&m); auti_na_mostu--; if (auti_na_mostu > 0) { pthread_cond_signal(red_a[Auto->smjer]); } else { smjer_na_mostu = -1; pthread_cond_broadcast(red_a[1 - Auto->smjer]); } printf("Auto %2d sisao s mosta, ide na %s (na mostu %d, idu na %s)\n", Auto->id, tsmjer[Auto->smjer], auti_na_mostu, tsmjer[smjer_na_mostu + 1]); pthread_mutex_unlock(&m); free(Auto); return NULL; } int main () { pthread_t thr_id; pthread_attr_t attr; int id_auta = 0; struct Automobil *Auto; pthread_attr_init(&attr); pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_DETACHED); while (1) { Auto = malloc(sizeof(struct Automobil)); Auto->id = ++id_auta; Auto->smjer = rand() & 1; printf("Novi auto %d iz smjera %s\n", id_auta, tsmjer[1 + 1 - Auto->smjer]); pthread_create(&thr_id, &attr, novi_auto, (void *) Auto); usleep(2000000); } return 0; }