/*In un bar-pasticceria il barista prepara caffè e cornetti riempiendo i vassoi relativi SOLO
QUANDO SONO VUOTI, rispettivamente con 4 caffè e 6 cornetti. Quando ha riempito il vassoio
vuoto, il barista si blocca. Ogni cliente acquista un caffè e due cornetti. Se non trova il caffè e/o i
cornetti, il cliente sblocca il barista e poi si blocca in coda in attesa che questo riempia il vassoio
che si è vuotato.
Scrivere il thread barista e i thread cliente che richiamano rispettivamente le procedure
riempiVassoio() e faiColazione().*/
#include <stdio.h>
#include <stdlib.h>
#include <pthread.h>
#include <errno.h>
#include <unistd.h>
#define NUM_MAX_CAFFE 8
#define NUM_MAX_CORNETTI 12
#define CONSUMO_CORNETTI 2
#define CONSUMO_CAFFE 1
#define NUM_THREAD_CLIENTI 5
#define NUM_COLAZIONI 10
typedef struct{
int numCornetti;
int numCaffe;
}Vassoio;
Vassoio vassoio;
pthread_mutex_t mutexVassoio;
pthread_mutex_t mutexClienti;
pthread_cond_t clienti;
pthread_cond_t barista;
int clientiAttivi = NUM_THREAD_CLIENTI;
pthread_t tid[NUM_THREAD_CLIENTI + 1]; //array dei thread in esecuzione (uno per il barista e
gli altri sono clienti)
void faiColazione(int numCliente){
while(vassoio.numCaffe < CONSUMO_CAFFE || vassoio.numCornetti <
CONSUMO_CORNETTI){
pthread_cond_signal(&barista);
printf("Cliente %d in attesa...\n",numCliente);
pthread_cond_wait(&clienti,&mutexVassoio);
printf("Cliente %d sbloccato!\n",numCliente);
}
vassoio.numCaffe -= CONSUMO_CAFFE;
vassoio.numCornetti -= CONSUMO_CORNETTI;
printf("Cliente %d consuma -- Rimasti--> Cornetti: %d | Caffe':
%d\n",numCliente,vassoio.numCornetti,vassoio.numCaffe);
}
void riempiVassoio(){
if(vassoio.numCaffe==0){
printf("Barista riempe vassoio di caffe'\n");
vassoio.numCaffe += NUM_MAX_CAFFE;
}
if(vassoio.numCornetti == 0){
printf("Barista riempe vassoio di cornetti\n");
vassoio.numCornetti += NUM_MAX_CORNETTI;
}
}
int ciSonoClientiAttivi(int clientiAttivi){
if(clientiAttivi==0){
pthread_mutex_unlock(&mutexClienti);
pthread_mutex_unlock(&mutexVassoio);
printf("Barista chiude...\n");
pthread_exit(NULL);
}
return 1;
}
void* threadCliente(void* args){
int numCliente = (int)(args) , n = NUM_COLAZIONI;
printf("Creato cliente %d\n",numCliente);
while(n>0){
pthread_mutex_lock(&mutexVassoio);
faiColazione(numCliente);
pthread_mutex_unlock(&mutexVassoio);
n--;
}
pthread_mutex_lock(&mutexClienti);
printf("Cliente %d se ne va...\n",numCliente);
clientiAttivi--;
if(clientiAttivi==0)
pthread_cond_signal(&barista);
pthread_mutex_unlock(&mutexClienti);
pthread_exit(NULL);
}
void* threadBarista(void* args){
printf("Creato barista\n");
while(1){
pthread_mutex_lock(&mutexVassoio);
pthread_mutex_lock(&mutexClienti);
while(vassoio.numCaffe != 0 && vassoio.numCornetti != 0 &&
ciSonoClientiAttivi(clientiAttivi)){
pthread_mutex_unlock(&mutexClienti);
printf("Barista in attesa...\n");
pthread_cond_wait(&barista,&mutexVassoio);
printf("\nBarista svegliato!\n");
pthread_mutex_lock(&mutexClienti);
}
pthread_mutex_unlock(&mutexClienti);
riempiVassoio();
printf("Barista sblocca i clienti!\n");
pthread_cond_broadcast(&clienti);
pthread_mutex_unlock(&mutexVassoio);
}
}
-
C - Thread - Concorrenza - Sistemi Operativi - Samafori
-
Sistemi Operativi: monitor, Gestione thread livello utente e nucleo, Deadlock
-
Sistemi operativi - Implementazione programma in C
-
Sistemi Operativi UNIX Shell + C [riassunti sintassi e comandi]