Ciao a tutti ragazzi,
avrei bisogno del vostro aiuto per comprendere bene del codice che il prof ha dato come esempio di tema d'esame.In pratica questo esercizio utilizza i semafori per gestire processi concorrenti.Il mio problema è che non riesco a comprendere una porzione del codice.
Il testo è il seguente:
i produttori producono interi > 0.
Un produttore può produrre un intero x solo se x non è maggiore della somma degli elementi
prodotti e non ancora consumati.
Se il produttore tenta di produrre l'intero x senza soddisfare questa condizione deve
attendere a produrre x nel momento opportuno.
Un consumatore non può consumare se l'elemento che dovrebbe essere consumato è maggiore o
uguale a tutti gli elementi prodotti dopo l'ultimo reset. Se il consumatore pensa a
consumare un elemento che non soddisfa queste condizioni, allora deve attendere a riprovare
a consumare al momento opportuno.
Svoglimento:
Inizialmente l'array è vuoto cioè contiene tutti elementi nulli. Quando un elemento dell'array
contiene un valore > 0 significa che quell'elemento è pieno. La somma degli elementi prodotti
e non ancora consumati è data dalla somma degli elementi presenti nell'array.
Produttore: se l'intero x è maggiore della somma degli elementi allora il processo deve essere
messo in stato di waiting
Consumatore: se l'elemento da prelevare è superiore al valore massimo presente nell'array, quindi
è superiore di tutti gli elementi dell'array(il processo va in waiting).
Ecco il codice:
produttore(){
while(true){
x = inserimento valore;
wait(empty); //attendo che il buffer sia libero
wait(sem_p);
if(x > max){
max = x;}
if(x > somma && somma > 0){
wait(sem_somma_prod); //caso particolare in cui x è maggiore della somma degli elementi disponibili
a[i] = x;
i=(i+1)%N;
somma = somma+x;
signal(sem_p); //potrei effettuare le signal una sola volta per tutti e 3 gli if
signal(full);
}
if(x < somma && somma > 0){
a[i] = x;
i=(i+1)%N;
somma = somma+x;
signal(sem_p);
signal(full);
}
if(x>somma && somma == 0){
a[i] = x;
i=(i+1)%N;
somma = somma+x;
signal(sem_p);
signal(full);}
}
}
consumatore(){
while(true){
wait(full);
wait(sem_c);
if(a[j] >=max){
wait(sem_magg_cons);
x = a[j];
j = (j+1)%N;
somma = somma - x; //decremento la somma al prelievo dell'intero
if(x == max){
max = a[0];
k = 0;
while(a[k]!=0){
if(a[k] > max)
max = a[k];
k++;}
}
signal(empty);
//signal(sem_somma_prod); ??
signal(sem_c);
}
}else{
x = a[j];
j = (j+1)%N;
somma = somma - x;
signal(empty);
//signal(sem_somma_prod); ??
signal(sem_c);
}
}
reset(){
for(i = 0, i < N, i++){
a[i] = 0; //imposta tutti gli elementi dell'array a 0
}
somma = 0;
max = 0;
empty = N;
full = 0;
sem_p = 1;
sem_C = 1;
sem_somma_prod = 0;
sem_magg_cons = 0;
}
sem_p e sem_c sono le 2 mutex
La parte che non mi è chiara è quella relativa al consumatore e nello specifico il secondo if contenuto all'interno del ciclo while!Qualcuno riesce ad aiutarmi??Grazie mille e buona giornata!