Estratto del documento

/*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);

}

}

Anteprima
Vedrai una selezione di 1 pagina su 4
C - Thread - Concorrenza - Sistemi Operativi - Monitor Pag. 1
1 su 4
D/illustrazione/soddisfatti o rimborsati
Acquista con carta o PayPal
Scarica i documenti tutte le volte che vuoi
Dettagli
SSD
Scienze matematiche e informatiche INF/01 Informatica

I contenuti di questa pagina costituiscono rielaborazioni personali del Publisher siboXD di informazioni apprese con la frequenza delle lezioni di Sistemi operativi e studio autonomo di eventuali libri di riferimento in preparazione dell'esame finale o della tesi. Non devono intendersi come materiale ufficiale dell'università Università degli Studi di Bologna o del prof Salomoni Paola.
Appunti correlati Invia appunti e guadagna

Domande e risposte

Hai bisogno di aiuto?
Chiedi alla community