POS/Lab 5 2022
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);
}