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).

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



/*
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);
}


Learn More :