Ragazzi, serve una mano, ho realizzato il seguente programma, le specifiche da rispettare sono:
- le attività di produzione indipendenti (fuori dalla sezione critica) devono durare 1s.
- le attività di consumo indipendente (fuori dalla sezione critica) durano 4s. Il numero di elementi consumati è pari alla metà degli elementi presenti dentro la array.
Non riesco a realizzare il punto in rosso, sapete dirmi come fare?
Grazie!
codice:
#include <stdio.h>
#include <stdlib.h>
#include <pthread.h>
#include <semaphore.h>
#define DIMENSIONE 20
int array[DIMENSIONE];
#define NP 3
#define NC 2
int inserito = 0;
int estratto = 0;
pthread_mutex_t mutex; //Semaforo binario per la mutua esclusione
pthread_cond_t attesa_per_spazio; //Si addormenta perchè non c'è spazio!
pthread_cond_t attesa_per_dati; //Si addormenta perchè non c'è niente da leggere!
int flag = 0; //Con 0 inizia il produttore!
//FUNZIONE DEL PRODUTTORE - int i perchè abbiamo più produttori, altrimenti era vuoto ()
void *produttore(int i){
int cont = 0; //indice che scorre l'array
while(1){ //Cicla per un numero infinito di volte, e' come dire 1=0 che e' sempre verificata
pthread_mutex_lock (&mutex); //Setto mutex = lock ed entro in sezione critica
//Inizio sezione critica
printf("Sono il produttore %d: sono in sezione critica\n", inserito);
while(cont == DIMENSIONE) //se il flag = 1 il produttore ha finito di produrre, cioè l'array e' pieno!
pthread_cond_wait(&attesa_per_spazio, &mutex); //si mette in attesa ed in ascolto sulla cond_var e sblocca il mutex e consente l'esecuzione dell'altro thread
array[cont] = inserito;
inserito ++;
cont ++;
pthread_mutex_unlock(&mutex);
//Fine della sezione critica!
sleep(1);
}
}
//FUNZIONE DEL CONSUMATORE
void *consumatore(int i){
while (1){
pthread_mutex_lock (&mutex);
while (estratto == DIMENSIONE) //L'array e' vuoto
pthread_cond_wait (&attesa_per_dati, &mutex);
printf("Ho estratto %d\n", array[estratto]);
estratto ++;
// SI DOVREBBE FARE UN FOR CON (DIMENSIONE - ESTRATTI/2)...come!?!
pthread_cond_broadcast (&attesa_per_spazio);
pthread_mutex_unlock(&mutex);
sleep(4);
}
}
int main(){
pthread_t prod[NP];
pthread_t cons[NC];
pthread_mutex_init (&mutex, NULL);
pthread_cond_init (&attesa_per_spazio, NULL);
pthread_cond_init (&attesa_per_dati, NULL);
int i = 0;
for(i=0; i<NP; i++)
pthread_create (&prod[i], NULL, (void*) produttore, (void*) i);
for(i=0; i<NC; i++)
pthread_create (&cons[i], NULL, (void*) consumatore, (void*) i);
pthread_exit(NULL);
}