/*Filip Despotovic 37-2020*/ #include #include #include #include #include #define N 100 #define NONE 0 #define JUG 1 #define SEVER 2 int smer = NONE; #define AUTO 1 #define BUS 2 #define KAMION 3 int na_mostu = 0; int br_automobila = 0; int br_autobusa = 0; int br_kamiona = 0; pthread_mutex_t m = PTHREAD_MUTEX_INITIALIZER; pthread_cond_t cond_auto = PTHREAD_COND_INITIALIZER; pthread_cond_t cond_bus = PTHREAD_COND_INITIALIZER; pthread_cond_t cond_kamion = PTHREAD_COND_INITIALIZER; void* voziJug(void* arg) { long id = (long)arg; int tip = rand() % 3 + 1; // auto, bus ili kamion sleep(rand() % 5 + 1); switch(tip) { case AUTO: pthread_mutex_lock( &m ); while(smer == SEVER || br_kamiona > 0) pthread_cond_wait( &cond_auto, &m ); br_automobila++; na_mostu++; smer = JUG; printf("%5s [%2ld] PRELAZI sa %8s...na mostu je %7s automobila(%2d) - buseva(%d) - kamiona(%d).\n", "AUTO", id, "JUGA", " |", br_automobila, br_autobusa, br_kamiona); pthread_mutex_unlock( &m ); sleep(1);//treba mu 1s da predje nadvoznjak pthread_mutex_lock( &m ); br_automobila--; na_mostu--; printf("%5s [%2ld] je PRESAO sa %8s...na mostu je %5s automobila(%2d) - buseva(%d) - kamiona(%d).\n", "AUTO", id, "JUGA", " |", br_automobila, br_autobusa, br_kamiona); if(na_mostu == 0) { smer = NONE; pthread_cond_broadcast( &cond_auto ); pthread_cond_broadcast( &cond_bus ); pthread_cond_broadcast( &cond_kamion ); } else { pthread_cond_broadcast( &cond_kamion ); } pthread_mutex_unlock( &m ); break; case BUS: pthread_mutex_lock( &m ); while(smer == SEVER || br_autobusa > 0 || br_kamiona > 0) pthread_cond_wait( &cond_bus, &m ); br_autobusa++; na_mostu++; smer = JUG; printf("%5s [%2ld] PRELAZI sa %8s...na mostu je %7s automobila(%2d) - buseva(%d) - kamiona(%d).\n", "BUS", id, "JUGA", " |", br_automobila, br_autobusa, br_kamiona); pthread_mutex_unlock( &m ); sleep(1);//treba mu 1s da predje nadvoznjak pthread_mutex_lock( &m ); br_autobusa--; na_mostu--; printf("%5s [%2ld] je PRESAO sa %8s...na mostu je %5s automobila(%2d) - buseva(%d) - kamiona(%d).\n", "BUS", id, "JUGA", " |", br_automobila, br_autobusa, br_kamiona); if(na_mostu == 0) { smer = NONE; pthread_cond_broadcast( &cond_auto ); pthread_cond_broadcast( &cond_bus ); pthread_cond_broadcast( &cond_kamion ); } else { pthread_cond_broadcast( &cond_bus ); pthread_cond_broadcast( &cond_kamion ); } pthread_mutex_unlock( &m ); break; case KAMION: pthread_mutex_lock( &m ); while(smer != NONE) pthread_cond_wait( &cond_kamion, &m ); br_kamiona++; na_mostu++; smer = JUG; printf("%5s [%2ld] PRELAZI sa %9s...na mostu je %5s automobila(%2d) - buseva(%d) - kamiona(%d).\n", "KAMION", id, "JUGA", " |", br_automobila, br_autobusa, br_kamiona); sleep(1);//treba mu 1s da predje nadvoznjak br_kamiona--; na_mostu--; printf("%5s [%2ld] je PRESAO sa %7s...na mostu je %5s automobila(%2d) - buseva(%d) - kamiona(%d).\n", "KAMION", id, "JUGA", " |", br_automobila, br_autobusa, br_kamiona); smer = NONE; pthread_cond_broadcast( &cond_auto ); pthread_cond_broadcast( &cond_bus ); pthread_cond_broadcast( &cond_kamion ); pthread_mutex_unlock( &m ); break; default: exit(0); } return NULL; } void* voziSever(void* arg) { long id = (long)arg; int tip = rand() % 3 + 1; // auto, bus ili kamion sleep(rand() % 5 + 1); switch(tip) { case AUTO: pthread_mutex_lock( &m ); while(smer == JUG || br_kamiona > 0) pthread_cond_wait( &cond_auto, &m ); br_automobila++; na_mostu++; smer = SEVER; printf("%5s [%2ld] PRELAZI sa %8s...na mostu je %7s automobila(%2d) - buseva(%d) - kamiona(%d).\n", "AUTO", id, "SEVERA", " |", br_automobila, br_autobusa, br_kamiona); pthread_mutex_unlock( &m ); sleep(1);//treba mu 1s da predje nadvoznjak pthread_mutex_lock( &m ); br_automobila--; na_mostu--; printf("%5s [%2ld] je PRESAO sa %8s...na mostu je %5s automobila(%2d) - buseva(%d) - kamiona(%d).\n", "AUTO", id, "SEVERA", " |", br_automobila, br_autobusa, br_kamiona); if(na_mostu == 0) { smer = NONE; pthread_cond_broadcast( &cond_auto ); pthread_cond_broadcast( &cond_bus ); pthread_cond_broadcast( &cond_kamion ); } else { pthread_cond_broadcast( &cond_kamion ); } pthread_mutex_unlock( &m ); break; case BUS: pthread_mutex_lock( &m ); while(smer == JUG || br_autobusa > 0 || br_kamiona > 0) pthread_cond_wait( &cond_bus, &m ); br_autobusa++; na_mostu++; smer = SEVER; printf("%5s [%2ld] PRELAZI sa %8s...na mostu je %7s automobila(%2d) - buseva(%d) - kamiona(%d).\n", "BUS", id, "SEVERA", " |", br_automobila, br_autobusa, br_kamiona); pthread_mutex_unlock( &m ); sleep(1);//treba mu 1s da predje nadvoznjak pthread_mutex_lock( &m ); br_autobusa--; na_mostu--; printf("%5s [%2ld] je PRESAO sa %8s...na mostu je %5s automobila(%2d) - buseva(%d) - kamiona(%d).\n", "BUS", id, "SEVERA", " |", br_automobila, br_autobusa, br_kamiona); if(na_mostu == 0) { smer = NONE; pthread_cond_broadcast( &cond_auto ); pthread_cond_broadcast( &cond_bus ); pthread_cond_broadcast( &cond_kamion ); } else { pthread_cond_broadcast( &cond_bus ); pthread_cond_broadcast( &cond_kamion ); } pthread_mutex_unlock( &m ); break; case KAMION: pthread_mutex_lock( &m ); while(smer != NONE) pthread_cond_wait( &cond_kamion, &m ); br_kamiona++; na_mostu++; smer = SEVER; printf("%5s [%2ld] PRELAZI sa %9s...na mostu je %5s automobila(%2d) - buseva(%d) - kamiona(%d).\n", "KAMION", id, "SEVERA", " |", br_automobila, br_autobusa, br_kamiona); sleep(1);//treba mu 1s da predje nadvoznjak br_kamiona--; na_mostu--; printf("%5s [%2ld] je PRESAO sa %7s...na mostu je %5s automobila(%2d) - buseva(%d) - kamiona(%d).\n", "KAMION", id, "SEVERA", " |", br_automobila, br_autobusa, br_kamiona); smer = NONE; pthread_cond_broadcast( &cond_auto ); pthread_cond_broadcast( &cond_bus ); pthread_cond_broadcast( &cond_kamion ); pthread_mutex_unlock( &m ); break; default: exit(0); } return NULL; } int main() { pthread_t vozila[ N ]; for(long i = 0; i < N; i++) (i % 2) ? pthread_create(vozila + i, NULL, voziJug, (void*)i) : pthread_create(vozila + i, NULL, voziSever, (void*)i); pthread_exit( NULL ); return 0; }