AREA DATI:
N // #numero processi client
mutex produttore [3] = 1 // array di semafori binari per verificare se il produttore scelto è libero
mutex carattere_generato [3] = 0 // array di semafori binari per risvegliare il produttore selezionato
struct client
{
boolean previous_char [3] = false;
int contatore = 0;
mutex client_libero = 1; // semaforo binario per indicare se il client è libero o no
};
typedef struct client CLIENTE;
CLIENTE [N]; // array di struct CLIENTE relativo ai client;
CONTROLLORE_S ()
{
while (true)
{
wait (mutex_1);
X = rand() %3 +1; // scelgo a caso il produttore
signal (mutex_1);
wait (produttore[X]); // aspetto che il produttore X sia libero
signal (carattere_generato[X]); // risveglio il produttore X
}
}
PRODUTTORE ()
{
wait (carattere_generato[X]); // aspetto che ci sia il carattere
wait (mutex_2)
genera_char(Y); // genero un carattere e lo memorizzo in Y
wait (CLIENTE.client_libero[i]); //aspetto che ci sia almeno un client in attesa
signal (carattere_generato);
signal (mutex_2);
signal (produttore[X]); // il produttore X è libero
}
CLIENT ()
{
while (CLIENTE[i].contatore < 3)
{
wait (carattere_generato);
wait (mutex_3);
if ((Y == 'A') && (CLIENTE[i].previous_char[1] == false)) // il carattere generato è A e
il client non l'ha letto prima
{
read_char_y();
CLIENTE[i].previous_char[1] = true;
}
else if ((Y == 'B') && (CLIENTE[i].previous_char[2] == false)) // il carattere generato è
B e il client non l'ha letto prima
{
read_char_y();
CLIENTE[i].previous_char[2] = true;
}
else (Y == 'C') && (CLIENTE[i].previous_char[3] == false)) // il carattere generato è
C e il client non l'ha letto prima
{
read_char_y();
CLIENTE[i].previous_char[3] = true;
}
signal (mutex_3);
signal (CLIENTE.client_libero[i]); // il client i-simo è libero
}
}