|
|
|
![]() |
|
Strumenti |
![]() |
#1 |
Junior Member
Iscritto dal: Nov 2012
Messaggi: 19
|
implemantazione semaforo fifo con i monitor
salve a tutti spero che voi siate in grado di aiutarmi,
sto tentando di implementare una parte di un progetto per l'uni. questa parte riguarda l'impllementazione di un semaforo generale con politica FIFO. ho gia creato il codice e a grandi linee funziona ma stranamente i valori di tale semaforo arrivano ad essere minori di zero cosa che non dovrebbe accadere. se qualcuno di voi fosse in grado di trovare il problema nel mio codice gliene sarei immensamente grado. Codice:
import java.util.Vector; public class FairSemaphore { protected Vector<nodoThread> waiting = new Vector<nodoThread>();//indica il vettore che implementa la coda FIFO private int count;//valore del semaforo private int inAttesa;//indica il numero di thread in attesa sulla coda String nome; //costruttore public FairSemaphore(int n) { nome="generico"; count=n; // Fifo= new coda(); inAttesa=0; } public FairSemaphore() { nome = "generico"; count=0; //Fifo= new coda(); inAttesa=0; } public FairSemaphore(String nom, int n ) { nome = nom; count=n; //Fifo= new coda(); inAttesa=0; } synchronized void P(){ Thread curr= Thread.currentThread(); System.err.println(Thread.currentThread().getName()+" ha eseguito una P() il valore del semaforo "+nome +" è" + count); if (count==0) {inAttesa++; System.err.println(Thread.currentThread().getName()+"verrà messo in attesa"); waiting.addElement(new nodoThread(Thread.currentThread(), false)); while (true) {try {wait();} catch( InterruptedException e ){} if ( curr.getName().equals( waiting.elementAt(0).identity()) && waiting.elementAt(0).state()) // implementa la politica FIFO (ogni thread che si sveglia controlla se è il primo della coda FIFO e se si può svegliare) {waiting.remove(0); //viene rimosso il thread dalla coda FIFO break;//esce dal while }//fine if interno } }//fine if esterno count--; System.err.println(Thread.currentThread().getName()+" ha finito P() il valore del semaforo "+nome +" è" + count); }//fine P() synchronized void V(){ //System.err.println(Thread.currentThread().getName()+" sta eseguendo una V() sul semaforo "+ nome + ", il valore e'"+count); count++; if (inAttesa>0) { for (int i=0;i<waiting.size();i++)//ricerca il prossimo thread da svegliare nella coda FIFO { if (waiting.elementAt(i).state()==false) {waiting.elementAt(i).setState(true); break; }} inAttesa--; } notifyAll(); //System.err.println(Thread.currentThread().getName()+" ha eseguito una notify() nella V() e il valore del semaforo " +nome+" è" +count); }//fine V() } // fine classe class nodoThread { private Thread curr; private boolean daSvegliare; public nodoThread(Thread i, boolean wake) { curr =i; daSvegliare=wake; } public nodoThread(Thread i) { curr =i; daSvegliare=false; } public boolean state() { return daSvegliare; } public String identity() { return curr.getName();; } public void setState(boolean wake) { daSvegliare=wake; } public void setNext(nodoThread t) { next=t; } } |
![]() |
![]() |
![]() |
#2 |
Junior Member
Iscritto dal: Nov 2012
Messaggi: 19
|
penso di aver risolto. a chiunque possa servire ecco il codice.
Codice:
import java.util.Vector; public class FairSemaphore { protected Vector<Thread> waiting = new Vector<Thread>(); private int count;//valore del semaforo private int inAttesa;//indica il numero di thread in attesa sulla coda String nome; //costruttore public FairSemaphore(int n) { nome="generico"; count=n; // Fifo= new coda(); inAttesa=0; } public FairSemaphore() { nome = "generico"; count=0; inAttesa=0; } public FairSemaphore(String nom, int n ) { nome = nom; count=n; inAttesa=0; } synchronized void P(){ Thread curr= Thread.currentThread(); //System.err.println(Thread.currentThread().getName()+" ha eseguito una P() il valore del semaforo "+nome +" è" + count); if (count==0 || inAttesa>0) {inAttesa++; System.err.println(curr.getName()+"verrà messo in attesa su " + nome ); waiting.addElement(curr); while (true) {try {wait();} catch( InterruptedException e ){} if ( curr.getName().equals( waiting.elementAt(0).getName()) && count>0 ) //l'ultima condizione forse è inutilee il modo per settarla nella v() anche*/ {waiting.remove(0); inAttesa--; break;//esce dal while }//fine if interno } }//fine if eesterno count--; System.err.println(curr.getName()+" ha finito P() il valore del semaforo "+nome +" è" + count); }//fine P() synchronized void V(){ count++; System.err.println(Thread.currentThread().getName()+" ha eseguito una V() sul semaforo "+ nome + ", il valore e'"+count); notifyAll(); //System.err.println(Thread.currentThread().getName()+" ha eseguito una notify() nella V() e il valore del semaforo " +nome+" è" +count); }//fine V() } |
![]() |
![]() |
![]() |
Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 08:20.