Riporto sotto le implementazioni in pseudo-codice, unica particolarità è che non ho usato i semafori inizializzati alla dimensione del buffer; ho implementato la soluzione così perchè sul buffer non scrivo un byte alla volta ma varia di volta in volta la scrittura e anche la parte del consumatore: consumo un numero sempre variabile di byte dal buffer.....
Codice: Seleziona tutto
sem_init(&full, 0, 0);
sem_init(&empty, 0, 0);
pthread_mutex_init(&mutex,NULL);
Codice: Seleziona tutto
producer() {
If ( buffer_full ) sem_wait(full);
pthread_mutex_lock(&mutex);
… // fill some slot
pthread_mutex_unlock(&mutex);
sem_getvalue(empty,&state);
If ( state < 0 ) sem_post(empty);
}
Codice: Seleziona tutto
consumer() {
If ( buffer_empty ) sem_wait(empty);
pthread_mutex_lock(&mutex);
… // empty some slot
pthread_mutex_unlock(&mutex);
sem_getvalue(full,&state);
If ( state < 0 ) sem_post(full);
}