Esercizio Programmazione concorrente con semafori

di il
4 risposte

Esercizio Programmazione concorrente con semafori

Salve a tutti, non riesco a venire a capo con il seguente esercizio:

Ho N ( con N pari) Thread Produttori che devono eseguire degli inserimenti in un Deposito D. Il singolo inserimento in D può essere fatto simultaneamente da una coppia di produttori consecutivi (prima P0 e P1, poi P2 e P3 etc) e poi ripetuto in round robin. La condizione è che l'inserimento in una coppia consecutiva può avvenire solo quando la coppia precedente ha completato gli inserimenti.

Ho pensato di utilizzare un array di semafori, in una classe chiama Schedulatore , vi posto il codice semplificato, tralasciando il discorso delle coppie, che però non funge.

Grazie

import java.util.concurrent.Semaphore;
 
public class Schedulatore {
 
    Semaphore [] as;
    int n;
    Schedulatore(int n)
    {
        this.n=n;
        as= new Semaphore[n];
        for(int i=0;i<n;i++) as[i]=new Semaphore(0);
        as[0].release();
       
    }
 
    int turno=0;
    public int getTurno(){
    turno++;
    return turno;
    }
 
    public void PrendiPossesso(int turno)
    {
 
            try {
                as[turno-1].acquire();
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
 
 
    }
 
    public void RilasciaPossesso(int turno)
    {
        
        
        
        if (turno>0)
        {
          //  System.out.println(turno);
            as[turno].release();
        }
        else
        {
            as[0].release();
        } 
 
    }
}

4 Risposte

  • Re: Esercizio Programmazione concorrente con semafori

    robin1 ha scritto:


    Il singolo inserimento in D può essere fatto simultaneamente da una coppia di produttori consecutivi
    Precisiamo una cosa: se questo inserimento consiste nella modifica di una singola variabile, una singola struttura dati, collezione, ecc.. allora il "simultaneo" non esiste. Detto in generale, va comunque usata una forma di "serializzazione" degli accessi per fare in modo che un solo thread per volta possa modificare una variabile, collezione, ecc...
    (ci sono collezioni "concorrenti" come ConcurrentHashMap ma questo è un altro discorso).

    robin1 ha scritto:


    Ho pensato di utilizzare un array di semafori, in una classe chiama Schedulatore , vi posto il codice semplificato, tralasciando il discorso delle coppie, che però non funge.
    Innanzitutto precisa COSA è quel Deposito e QUALE metodo/i ha per la modifica (quel inserimento di cui parli). Chiarisci anche se Deposito deve contenere questa logica di sincronizzazione e debba quindi sapere del concetto delle coppie.
  • Re: Esercizio Programmazione concorrente con semafori

    Ciao e grazie per la risposta.

    Il deposito D è un oggetto di dimensione infinita. Ho utilizzato una ArrayList dove di volta in volta vado ad aggiungere gli elementi.
    Posto il Codice:
    
    public class Deposito {
        ArrayList<Integer> Cod = new ArrayList<Integer>();
     
     
        public boolean Inserisci(int elemento)
        {
            Cod.add(elemento);
           
        }
     
        public int getLen()
        {
            return Cod.size();
        }
    }
    La sincronizzazione deve avvenire solo tra le coppie in round robin , nel senso : P0-P1 (anche simultaneamente) , e solo dopo che una coppia ha finito, la coppia successiva può iniziare l'inserimento.
  • Re: Esercizio Programmazione concorrente con semafori

    robin1 ha scritto:


    La sincronizzazione deve avvenire solo tra le coppie in round robin , nel senso : P0-P1 (anche simultaneamente) , e solo dopo che una coppia ha finito, la coppia successiva può iniziare l'inserimento.
    La classe Deposito, così come è scritta sopra, NON è thread-safe. Cioè non può essere usata da più thread. Se vuoi renderla thread-safe, il minimo da fare è mettere synchronized sui due metodi (e su altri che eventualmente inserirai dopo). Questo porta alla mutua-esclusione tra i thread, ovvero ciascun metodo diventa "atomico" e può essere eseguito da un solo thread per volta.
    Perché come ti ho detto prima, se si tratta di modificare uno stesso "stato" da parte di più thread (e specialmente con una collezione "semplice" come ArrayList), il "simultaneo" non esiste. Solo un thread per volta può modificare il ArrayList, non si può fare diversamente.

    Quindi innanzitutto devi stabilire se ti va bene qualunque sequenza all'interno della coppia, P0 poi P1 oppure P1 poi P0. O se invece vuoi garantire una sola sequenza ben precisa (es. la prima).

    Stabilito questo, se vuoi fare una classe esterna a Deposito che coordina i produttori (e che dovrà essere usata da TUTTI i produttori, per coerenza/correttezza), si può fare. Puoi anche stabilire se questa classe esterna dovrà solo coordinare i thread-produttori ma poi essi invocheranno direttamente i metodi di Deposito oppure se Deposito lo incapsuli nella classe di sincronizzazione e i produttori usano Deposito indirettamente.
  • Re: Esercizio Programmazione concorrente con semafori

    Ciao, devo garantire una sequenza ben precisa, avendo N Thread le sequenze dovranno essere :
    prima P0-P1, poi P2-P3, poi P4-P5 e cosi via. E' questo che non riesco a capire come poterlo far funzionare.

    Grazie
Devi accedere o registrarti per scrivere nel forum
4 risposte