POS/Lab 5 2022

Izvor: SI Wiki
Pređi na navigaciju Pređi na pretragu

Grupa 1

Postavka

Dopuniti datu test5.c datoteku tako da se reši problem spavajućeg berberina. Berberin ima salon. U salonu šiša mušterije. Dok nema mušterija u salonu, berberin čeka. Berberin šiša mušterije po redu kojim su ušle u salon. Zbog zdravstvenih propisa u salonu mogu biti najviše dve mušterije. Svaka mušterija ima jedinstveni identifikator koji dobija prilikom kreiranja. Taj identifikator služi za opis aktivnosti (npr. ulazak u salon, pristupanje šišanju, itd.).

Dodati delove u datoteku test5.c koji su potrebni da bi program radio traženi posao. Postojeći kod ne sme se menjati. Dozvoljeno je koristiti pthreads niti i POSIX semafore. Glavna nit treba da čeka dok berberin i mušterije ne završe.

Primer jednog izlaza:

Ulazi u berbernicu 0
Sredjujem musteriju 0
Sredjena musterija 0
Izlazi iz berbernice 0
Ulazi u berbernicu 1
Sredjujem musteriju 1
Ulazi u berbernicu 2
Sredjena musterija 1
Izlazi iz berbernice 1
Sredjujem musteriju 2
Sredjena musterija 2
Izlazi iz berbernice 2
Ulazi u berbernicu 0
Sredjujem musteriju 0
Sredjena musterija 0
Izlazi iz berbernice 0
Ulazi u berbernicu 1
Sredjujem musteriju 1
Sredjena musterija 1
Izlazi iz berbernice 1
Ulazi u berbernicu 0
Sredjujem musteriju 0
Sredjena musterija 0
Izlazi iz berbernice 0
Ulazi u berbernicu 2
Sredjujem musteriju 2
Ulazi u berbernicu 1
Sredjena musterija 2
Izlazi iz berbernice 2
Sredjujem musteriju 1
Sredjena musterija 1
Izlazi iz berbernice 1
Ulazi u berbernicu 0
Sredjujem musteriju 0
Sredjena musterija 0
Izlazi iz berbernice 0
Ulazi u berbernicu 1
Sredjujem musteriju 1
Ulazi u berbernicu 2
Sredjena musterija 1
Izlazi iz berbernice 1
Sredjujem musteriju 2
Ulazi u berbernicu 0
Sredjena musterija 2
Izlazi iz berbernice 2
Sredjujem musteriju 0
Sredjena musterija 0
Izlazi iz berbernice 0
Ulazi u berbernicu 1
Sredjujem musteriju 1
Sredjena musterija 1
Izlazi iz berbernice 1
Ulazi u berbernicu 2
Sredjujem musteriju 2
Sredjena musterija 2
Izlazi iz berbernice 2
Ulazi u berbernicu 2
Sredjujem musteriju 2
Sredjena musterija 2
Izlazi iz berbernice 2

Rešenje

Ovaj zadatak nije rešen. Pomozite SI Wiki tako što ćete ga rešiti.

Sledeće rešenje je osvojilo 6/14 bodova i asistenti su ostavili komentare napomenute ispod.

#include <stdio.h>
#include <stdlib.h>
#include <pthread.h>
#include <semaphore.h>
#include <unistd.h>

#define printThreadSafe(str,...) {\
    sem_wait(&mutexIspisi);\
    printf(str, __VA_ARGS__);\
    sem_post(&mutexIspisi);\
}

#define M (5)
#define N (3)

sem_t mutexIspisi;
sem_t Udji;
sem_t musterije;

static int ind=0;

void udjiUBerbernicu(int id) {
    sem_wait(&Udji); // Коментар: "kada da izadje? -2"
}

void* musterija(void *param) {
    int id = ind++ ; // Odrediti ID musterije
                     // Коментар: "nije thread safe -2"
    sem_wait(&musterije);
    for (int i = 0; i < M; i++) {
        sleep(id * 3 + rand()%10);
        printThreadSafe("Ulazi u berbernicu %d\n", id);
        udjiUBerbernicu(id);
        printThreadSafe("Izlazi iz berbernice %d\n", id);
        sleep(id * 3 + rand()%10);
    }
    free(param);
    sem_post(&musterije);
    return 0;
}

void podsisaj() {
    int id = ind ; // odrediti sledecu musteriji
                   // Коментар: "ovo treba da preda musterija koja udje -2"
    printThreadSafe("Sredjujem musteriju %d\n", id);
    sleep(3);
    printThreadSafe("Sredjena musterija %d\n", id);
}

void* berber(void* param) {
    for (int i = 0; i < M * N; i++) {
        // Коментар: "kada ima nekog? -2"
        podsisaj();
        sleep(1);
        sem_post(&Udji);
    }
    return 0;
}

int main() {
    pthread_t berberin, musterije[N];
    srand(time(0));
    sem_init(&mutexIspisi, 0, 1);
    // inicijalizacija ostalih semafora i niti
    sem_init(&Udji, 0, 2);
    sem_init(&musterije, 0, N);
    if (pthread_create(&berberin, 0, berber, 0)){
        perror(NULL);
        exit(1);
    }
    for (int i=0; i<N; i++) {
        if (pthread_create(&musterije[i], 0, musterija, 0)) {
            perror(NULL);
            exit(1);
        }
    }
    // kraj inicijalizacije
    // Sacekati sve niti
    pthread_join(berberin,0);
    for(int i=0; i<N; i++){
        pthread_join(musterije[i],0);
    }
    sem_close(&mutexIspisi);
    sem_destroy(&Udji);
    sem_destroy(&musterije);
    exit(0);
}