Simulujte nasledujcu situaciu. Dvadsat sportovcov (desat muzov a desat zien) spolu trenuju beh. Kazdy sportovec
po kazdom odbehnutom okruhu si oddychne a potom zase ide na start a zase bezi. Muzovi beh trva nejaky cas
(v simulacii 2s) a potom oddychuje (v simulacii 2s). Zene beh trva nejaky cas (v simulacii 3s) a potom oddychuje
(v simulacii 3s).
1. Doplnte do programu premennu pocitajucu pocet dokoncenych okruhov, ktory spolu vsetci sportovci odbehli
(jedno pocitadlo pre celu skupinu). [2b]
2. Zabezpecte ukoncenie simulacie, ked kazdy muz odbehne 15 okruhov a kazda zena odbehne 10 okruhov. [2b]
3. Zabezpecte, aby sa vsetci sportovci (co budu bezat dalsi okruh) po oddychu na starte pockali a az potom
vystartovali do dalsieho kola. [6b]
Poznamky:
- na synchronizaciu pouzite iba mutexy+podmienene premenne alebo semafory
- nespoliehajte sa na uvedene casy, simulacia by mala fungovat aj s inymi casmi alebo s nahodne generovanymi casmi
- build (console): gcc sportovci.c -o sportovci -lpthread
po kazdom odbehnutom okruhu si oddychne a potom zase ide na start a zase bezi. Muzovi beh trva nejaky cas
(v simulacii 2s) a potom oddychuje (v simulacii 2s). Zene beh trva nejaky cas (v simulacii 3s) a potom oddychuje
(v simulacii 3s).
1. Doplnte do programu premennu pocitajucu pocet dokoncenych okruhov, ktory spolu vsetci sportovci odbehli
(jedno pocitadlo pre celu skupinu). [2b]
2. Zabezpecte ukoncenie simulacie, ked kazdy muz odbehne 15 okruhov a kazda zena odbehne 10 okruhov. [2b]
3. Zabezpecte, aby sa vsetci sportovci (co budu bezat dalsi okruh) po oddychu na starte pockali a az potom
vystartovali do dalsieho kola. [6b]
Poznamky:
- na synchronizaciu pouzite iba mutexy+podmienene premenne alebo semafory
- nespoliehajte sa na uvedene casy, simulacia by mala fungovat aj s inymi casmi alebo s nahodne generovanymi casmi
- build (console): gcc sportovci.c -o sportovci -lpthread
/* Meno: Datum: Simulujte nasledujcu situaciu. Dvadsat sportovcov (desat muzov a desat zien) spolu trenuju beh. Kazdy sportovec po kazdom odbehnutom okruhu si oddychne a potom zase ide na start a zase bezi. Muzovi beh trva nejaky cas (v simulacii 2s) a potom oddychuje (v simulacii 2s). Zene beh trva nejaky cas (v simulacii 3s) a potom oddychuje (v simulacii 3s). 1. Doplnte do programu premennu pocitajucu pocet dokoncenych okruhov, ktory spolu vsetci sportovci odbehli (jedno pocitadlo pre celu skupinu). [2b] 2. Zabezpecte ukoncenie simulacie, ked kazdy muz odbehne 15 okruhov a kazda zena odbehne 10 okruhov. [2b] 3. Zabezpecte, aby sa vsetci sportovci (co budu bezat dalsi okruh) po oddychu na starte pockali a az potom vystartovali do dalsieho kola. [6b] Poznamky: - na synchronizaciu pouzite iba mutexy+podmienene premenne alebo semafory - nespoliehajte sa na uvedene casy, simulacia by mala fungovat aj s inymi casmi alebo s nahodne generovanymi casmi - build (console): gcc sportovci.c -o sportovci -lpthread */ #include <stdio.h> #include <stdlib.h> #include <pthread.h> #include <semaphore.h> #include <unistd.h> // signal na zastavenie simulacie int stoj = 0; int stoj_zeny = 0; int stoj_muzi = 0; int pocet_okruhov_zeny = 0; int pocet_okruhov_muzi = 0; int barrier_count = 0; pthread_cond_t cond; pthread_mutex_t cond_mutex; int inbarrier = 0; int pocet_okruhov = 0; int dokoncenych_muzov = 0; int dokoncenych_zien = 0; pthread_mutex_t mutex; pthread_mutex_t dm_mutex; pthread_mutex_t dz_mutex; void muz_bez(void) { sleep(0.2); } // muz void muz_oddychuj(void) { sleep(0.2); } void *muz(void *ptr) { int pocet_koleciek = 0; while(!stoj_muzi) { muz_bez(); pthread_mutex_lock(&mutex); pocet_okruhov++; pocet_koleciek++; pocet_okruhov_muzi++; printf("Muz okruh c.%d\n", pocet_okruhov_muzi); pthread_mutex_unlock(&mutex); if (pocet_koleciek == 15) { pthread_mutex_lock(&dm_mutex); dokoncenych_muzov++; printf("Dokoncenych muzov %d\n", dokoncenych_muzov); if (dokoncenych_muzov == 10) { stoj_muzi = 1; pthread_mutex_unlock(&dm_mutex); break; } pthread_mutex_unlock(&dm_mutex); } muz_oddychuj(); pthread_mutex_lock(&cond_mutex); while (inbarrier) pthread_cond_wait(&cond, &cond_mutex); barrier_count++; if (barrier_count == 20 || (barrier_count == 10 && stoj_zeny == 1)) { inbarrier = 1; printf("VSETCI STOJA PRESTAVKA KRUCI \n"); pthread_cond_broadcast(&cond); } else { while (!inbarrier) pthread_cond_wait(&cond, &cond_mutex); } barrier_count--; if (barrier_count == 0) { inbarrier = 0; pthread_cond_broadcast(&cond); } pthread_mutex_unlock(&cond_mutex); } return NULL; } // zena void zena_bez(void) { sleep(0.3); } void zena_oddychuj(void) { sleep(0.2); } void *zena(void *ptr) { int pocet_koleciek = 0; while(!stoj_zeny) { zena_bez(); pthread_mutex_lock(&mutex); pocet_okruhov++; pocet_okruhov_zeny++; pocet_koleciek++; printf("Zena okruh c.%d\n", pocet_okruhov_zeny); pthread_mutex_unlock(&mutex); if (pocet_koleciek == 10) { pthread_mutex_lock(&dz_mutex); dokoncenych_zien++; printf("Dokoncenych zien je %d\n",dokoncenych_zien); if (dokoncenych_zien == 10) { stoj_zeny = 1; pthread_mutex_unlock(&dz_mutex); break; } pthread_mutex_unlock(&dz_mutex); } zena_oddychuj(); pthread_mutex_lock(&cond_mutex); while (inbarrier) pthread_cond_wait(&cond, &cond_mutex); barrier_count++; if (barrier_count == 20 || (barrier_count == 10 && stoj_muzi == 1)) { inbarrier = 1; printf("VSETCI STOJA PRESTAVKA KRUCI \n"); pthread_cond_broadcast(&cond); } else { while (!inbarrier) pthread_cond_wait(&cond, &cond_mutex); } barrier_count--; if (barrier_count == 0) { inbarrier = 0; pthread_cond_broadcast(&cond); } pthread_mutex_unlock(&cond_mutex); } return NULL; } // main f. int main(void) { int i; pthread_t zeny[10]; pthread_t muzi[10]; pthread_cond_init(&cond, NULL); pthread_mutex_init(&cond_mutex, NULL); pthread_mutex_init(&mutex, NULL); pthread_mutex_init(&dz_mutex, NULL); pthread_mutex_init(&dm_mutex, NULL); for (i=0;i<10;i++) pthread_create(&zeny[i], NULL, &zena, NULL); for (i=0;i<10;i++) pthread_create(&muzi[i], NULL, &muz, NULL); for (i=0;i<10;i++) pthread_join(zeny[i], NULL); for (i=0;i<10;i++) pthread_join(muzi[i], NULL); exit(EXIT_SUCCESS); }