/* Da bi se odabir sledeceg tima ucinio pravednijim uvodimo pravilo da sledeci tim koji ulazi na teren bude onaj tim koji ima igraca koji je najduze cekao. Tijana Stevanovic, Milutin Aleksic, Dragutin Ostojic, 20222. */ #include #include #include #include #include #include #define N 22 #define CRVENI 0 #define PLAVI 1 #define ZELENI 2 #define NIKO 3 int trenira = NIKO; pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER; pthread_cond_t cond = PTHREAD_COND_INITIALIZER; int brojIgracaKojiCekaju[3]; int brojIgracaKojiTreniraju[3]; int vremeCekanja[3] = {INT_MAX, INT_MAX, INT_MAX}; // trenutak od koga neki tim ceka, INT_MAX kao default zbog jednostavnosti buducih uslova void *treniraj(void *i) { long tid = (long)i; int vreme = rand() % 61; sleep(vreme); printf("Igrac %ld dolazi na igraliste u trenutku %d\n", tid, vreme); int tim = tid % 3; pthread_mutex_lock(&mutex); brojIgracaKojiCekaju[tim]++; if(brojIgracaKojiCekaju[tim] == 1) vremeCekanja[tim] = vreme; while(trenira != tim && trenira != NIKO || (trenira == NIKO && (vremeCekanja[tim] > vremeCekanja[(tim + 1) % 3] || vremeCekanja[tim] > vremeCekanja[(tim + 2) % 3]))) pthread_cond_wait(&cond, &mutex); trenira = tim; brojIgracaKojiCekaju[tim]--; brojIgracaKojiTreniraju[tim]++; int vremeTreniranja = 1 + rand() % 3; printf("Igrac %ld je usao na teren i trenirace %d s\n", tid, vremeTreniranja); pthread_mutex_unlock(&mutex); sleep(vremeTreniranja); pthread_mutex_lock(&mutex); brojIgracaKojiTreniraju[tim]--; if(brojIgracaKojiTreniraju[tim] == 0) { trenira = NIKO; vremeCekanja[tim] = INT_MAX; pthread_cond_broadcast(&cond); } printf("Igrac %ld je zavrsio treniranje nakon %d s\n", tid, vremeTreniranja); pthread_mutex_unlock(&mutex); pthread_exit(NULL); } int main() { pthread_t threads[N * 3]; for(long i = 0; i < N * 3; i++) { pthread_create(threads + i, NULL, treniraj, (void*)i); } pthread_exit(NULL); }