Visualizzazione dei risultati da 1 a 2 su 2
  1. #1
    Utente bannato
    Registrato dal
    Nov 2007
    residenza
    Acicatena (Catania)
    Messaggi
    1,854

    Programma con 3 thread produttori e 2 tread consumatori!

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

  2. #2
    Utente bannato
    Registrato dal
    Nov 2007
    residenza
    Acicatena (Catania)
    Messaggi
    1,854
    Nessuno aiuto?

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2024 vBulletin Solutions, Inc. All rights reserved.