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); }


Rispondi quotando