Visualizzazione dei risultati da 1 a 6 su 6
  1. #1
    Utente di HTML.it L'avatar di Donovant
    Registrato dal
    Sep 2005
    residenza
    London
    Messaggi
    1,329

    Esercizio sui semafori, ma non si avvia l'ultimo thread

    Salve sto cercando di svolgere un esercizio per l'UNI in cui mi si chiede di sincronizare più thread in modo che si verifichi una predefinita sequenza di essi.

    Di seguito le classi create da me:

    do per scontato che chi aiuterà conosca cosa fanno le classi SemaforoBinario e SemaforoContatore:

    SYNCH:
    codice:
    public class SynchSem{ // usato per sincronizzare i thread
    
        private SemaforoBinario mutexA = new SemaforoBinario(1);
        private SemaforoBinario mutexB = new SemaforoBinario(1);
        private SemaforoCont sA = new SemaforoCont(0);
        private SemaforoCont sB = new SemaforoCont(0);
    
        @Override
        public void passaA(){
             
            sA.P();
            System.out.println("Sezione critica "+Thread.currentThread().toString());
            sB.V();
            
        }
    
        @Override
        public void passaB() {
               
              mutexB.P();
               
                   sA.V();
                   sB.P();
                   System.out.println("Sezione critica "+Thread.currentThread().toString());
                   sA.V();
                   sB.P();
                   sA.V();
                   sB.P(); 
                   sB.V();
                   
               mutexB.V();
        }
    
    }
    A (B uguale ad A):
    codice:
    public class A extends Thread{
        
         private Synch s;
         private int id;
         
         public A(int ID, Synch S ){ 
             super(""+ID); 
             s=S;
             id=ID;    
         }
         
         @Override
         public void run(){
             
             delay(1000,6000);
             s.passaA();
            
         }
         
         @Override
         public String toString(){ return "A#"+id; }
         
         private void delay(int min, int max){ // lo uso per avere tutti i thread a start nel main
              try{
                  sleep( Math.round(Math.random()*(max-min))+min );
              }catch(InterruptedException exc){}
         }
         
         
    }
    MAIN:
    codice:
    public static void main(String[] args) {
            
            Synch s = new SynchSem();
            A a1 = new A(1,s);
            A a2 = new A(2,s);
            A a3 = new A(3,s);
            B b1 = new B(1,s); 
            B b2 = new B(2,s);
            
            a1.start();
            a2.start();
            a3.start();
            b1.start();
            b2.start();
    }
    La sequenza dovrebbe essere ABAAB, fino a ABA tt ok....
    poi non va più, alle volte arriva anche a stampare ABAA, ma l'ultima B proprio mai.
    Help me, please!
    Beati gli smemorati, perchè avranno la meglio anche sui loro errori...

    My gallery: http://donovant.deviantart.com/gallery/

  2. #2
    Utente di HTML.it L'avatar di @DI3GO@
    Registrato dal
    Nov 2008
    Messaggi
    537
    i tag code...poi controllo il codice
    Nipote: persona incompetente, con le soli doti di "copia/incolla" e la creazione automatica di siti internet ed interfaccie grafiche.Compie lavori apparentemente qualificati e richiesta una modifica sparisce in quatemala con i pochi soldi ottenuti.[...] Fonte la Diegonzelli

  3. #3
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,320
    Originariamente inviato da @DI3GO@
    i tag code...poi controllo il codice
    Li ho aggiunti io...

    @Donovant: non sei nuovo del forum, dovresti conoscerle queste cose...


    Ciao.
    "Perchè spendere anche solo 5 dollari per un S.O., quando posso averne uno gratis e spendere quei 5 dollari per 5 bottiglie di birra?" [Jon "maddog" Hall]
    Fatti non foste a viver come bruti, ma per seguir virtute e canoscenza

  4. #4
    Utente di HTML.it L'avatar di Donovant
    Registrato dal
    Sep 2005
    residenza
    London
    Messaggi
    1,329
    Si infatti volevo metterli...ma ricordo che ultimamente qualcuno mi aveva chiesto di non metterli, ma nn ricordo il perchè
    Grazie cmq.
    Beati gli smemorati, perchè avranno la meglio anche sui loro errori...

    My gallery: http://donovant.deviantart.com/gallery/

  5. #5
    Utente di HTML.it L'avatar di Donovant
    Registrato dal
    Sep 2005
    residenza
    London
    Messaggi
    1,329
    Ho provato anche un'altra sequenza, di un altro esercizio "ABAA" :

    codice:
       public void passaA(){
             
              mutexA.P();
                System.out.println("Sezione critica "+Thread.currentThread().toString());
                sB.V();
                sA.P();
                
               mutexA.V(); 
          
       }
    
       public void passaB() {
               
               sB.P();
               System.out.println("Sezione critica "+Thread.currentThread().toString());
               sA.V();
               sA.V();
       }
    Nel main ovviamente ho dato lo start a A1,A2,A3,B1.
    Quello che succede nn lo capisco, perchè a volte va bene a buon fine, altre invece stampa
    ABA l'ultimo Thread molte volte non viene stampato ( processato ), perchè secondo voi?
    Beati gli smemorati, perchè avranno la meglio anche sui loro errori...

    My gallery: http://donovant.deviantart.com/gallery/

  6. #6
    Utente di HTML.it L'avatar di Donovant
    Registrato dal
    Sep 2005
    residenza
    London
    Messaggi
    1,329
    Ok tutto risolto...erano le classi SemaforoBinario e SemaforoContatore, che avevano un errore...
    Ora tutto funge, mi sembrava strano...la sincro era fatta bene.
    L'unica cosa vorrei sapere, alla fine dell'esecuzione del main..NetBeans mi dice che l'ultimo thread è ancora in pausa, wait, bloccato dall'ultimo semaforo rosso.
    Beati gli smemorati, perchè avranno la meglio anche sui loro errori...

    My gallery: http://donovant.deviantart.com/gallery/

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 © 2025 vBulletin Solutions, Inc. All rights reserved.