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