atelzut2
23-10-2013, 23:41
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.
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;
}
}
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.
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;
}
}