Programmazione concorrente!

di il
1 risposte

Programmazione concorrente!

Salve a tutti, ho da fare questo esercizio di programmazione concorrente:

Scrivere un programma sequenziale che effettua la moltiplicazione righe per colonne di due matrici n x n quindi scrivere un due versioni parallele utilizzando k processi, considerando prima una il caso che n sia multiplo di k e poi il cosa in cui n non sia multiplo di k.
Non capisco concettualmente come devo fare, nel caso dei produttori consumatori " esercizio precedente" è semplice a prescindere dai n Thread consumatori e k produttori , cioè alla fine tutti i consumatori vengono creati dalla stessa classe in java idem per i produttori, e si sincronizzavano su un buffer che li gestiva il tutto come monitor.. forse è meglio se leggete il codice..




package santoro;
/***************************************************************/
/*             ----->BufferLimitato 2.0<-----                  */
/***************************************************************/
/* Implementa un biffer FIFO di dimensione prefissa accesibile */
/* da più thread. Ha un costruttore che prende come  parametro */
/* la dimensione del buffer.  L'accesso  al buffer  avviene in */
/* mutua esclusione.										   */
/***************************************************************/



public class BufferLimitato {
	private int in; 
    private int out;
    private int count;  
    private Object[] buffer;
    
    
    
    //Costruttore della classe
    //Inizializza le variabili e crea un array di oggetti di lunghezza pari a "size"
    public BufferLimitato(int size){
        in = 0;
        out = 0;
        count = 0;
        buffer = new Object[size]; 
    }
    
    // Metodo insert
    // Inserire oggetti nel buffer controllando che il buffer non sia pieno
    public synchronized void insert(Object item) throws InterruptedException{
        while (isFull()){
            try {
                wait();
                
            } catch (Exception ex){ System.err.println(" " +ex.getCause());
            }
        }
        count++;
        buffer[in] = item; 
        in = (in + 1) % buffer.length; 
        notifyAll();
    }
    
    // Rimuove oggetti dal buffer controllando che non sia vuoto
    public synchronized Object remove() throws InterruptedException {
        while (isEmpty()){
            try {
                wait();
                
            } catch (Exception ex){System.err.println(" " +ex.getCause());
            }
        }
        Object item = buffer[out]; 
        out = (out + 1) % buffer.length;
        count--;
        notifyAll();
        return item;
    }
    // metodo per verificare se il Buffer è Vuoto
    private boolean isEmpty(){
        return count == 0;
    }
    // Metodo per verificare se il Buffer è Pieno
    private boolean isFull(){
        return count == buffer.length;
    }

}

1 Risposte

  • Re: Programmazione concorrente!

    ybor4 ha scritto:


    Salve a tutti, ho da fare questo esercizio di programmazione concorrente:

    Scrivere un programma sequenziale che effettua la moltiplicazione righe per colonne di due matrici n x n quindi scrivere un due versioni parallele utilizzando k processi, considerando prima una il caso che n sia multiplo di k e poi il cosa in cui n non sia multiplo di k.
    Non capisco concettualmente come devo fare, nel caso dei produttori consumatori " esercizio precedente" è semplice a prescindere dai n Thread consumatori e k produttori , cioè alla fine tutti i consumatori vengono creati dalla stessa classe in java idem per i produttori, e si sincronizzavano su un buffer che li gestiva il tutto come monitor.. forse è meglio se leggete il codice..




    package santoro;
    /***************************************************************/
    /*             ----->BufferLimitato 2.0<-----                  */
    /***************************************************************/
    /* Implementa un biffer FIFO di dimensione prefissa accesibile */
    /* da più thread. Ha un costruttore che prende come  parametro */
    /* la dimensione del buffer.  L'accesso  al buffer  avviene in */
    /* mutua esclusione.										   */
    /***************************************************************/
    
    
    
    public class BufferLimitato {
    	private int in; 
        private int out;
        private int count;  
        private Object[] buffer;
        
        
        
        //Costruttore della classe
        //Inizializza le variabili e crea un array di oggetti di lunghezza pari a "size"
        public BufferLimitato(int size){
            in = 0;
            out = 0;
            count = 0;
            buffer = new Object[size]; 
        }
        
        // Metodo insert
        // Inserire oggetti nel buffer controllando che il buffer non sia pieno
        public synchronized void insert(Object item) throws InterruptedException{
            while (isFull()){
                try {
                    wait();
                    
                } catch (Exception ex){ System.err.println(" " +ex.getCause());
                }
            }
            count++;
            buffer[in] = item; 
            in = (in + 1) % buffer.length; 
            notifyAll();
        }
        
        // Rimuove oggetti dal buffer controllando che non sia vuoto
        public synchronized Object remove() throws InterruptedException {
            while (isEmpty()){
                try {
                    wait();
                    
                } catch (Exception ex){System.err.println(" " +ex.getCause());
                }
            }
            Object item = buffer[out]; 
            out = (out + 1) % buffer.length;
            count--;
            notifyAll();
            return item;
        }
        // metodo per verificare se il Buffer è Vuoto
        private boolean isEmpty(){
            return count == 0;
        }
        // Metodo per verificare se il Buffer è Pieno
        private boolean isFull(){
            return count == buffer.length;
        }
    
    }

    un po + chiaro????
Devi accedere o registrarti per scrivere nel forum
1 risposte