Hallo,
Ich brauch mal wieder eure Hilfe...
Ich muss hier eine Message Queue in Java basteln, jedoch mit einer selbst gebastelten Semaphore Klasse. Hier erstmal die Message Queue ohne Semaphore, d.h die "normale" :
Die funktioniert auch ohne Probleme, die wird im System auch richtig bewertet!
Jetzt meine Semaphore Klasse :
Die ist denk ich (?) auch richtig so!
Jetzt die Message Queue mit den Semaphoren :
Die funktioniert aber nicht ****
Vor allem meckert das System, dass ich eben die Semaphore nicht richtig benutze. Aber, ich brauch doch jeweils einen für den gegenseitigen Ausschluss der Methoden, sowie einen für den Produzenten und Konsumenten. Das müsste doch auch so stimmen, oder nicht?
Ich brauch mal wieder eure Hilfe...
Ich muss hier eine Message Queue in Java basteln, jedoch mit einer selbst gebastelten Semaphore Klasse. Hier erstmal die Message Queue ohne Semaphore, d.h die "normale" :
Java:
package fopt.assignment2a;
public class Buffer
{
private boolean available = false;
private int data;
//private Semaphore[] sems;
public synchronized void put( int x)
{
while(available)
{
try
{
wait();
}
catch(InterruptedException e)
{
}
}
data = x;
available = true;
notifyAll();
}
public synchronized int get()
{
while(!available)
{
try
{
wait();
}
catch(InterruptedException e)
{
}
}
available = false;
notifyAll();
return data;
}
}
Die funktioniert auch ohne Probleme, die wird im System auch richtig bewertet!
Jetzt meine Semaphore Klasse :
Java:
package fopt.assignment2b;
public class Semaphore
{
private int value;
public Semaphore(int init)
{
if(init < 0)
{
init = 0;
}
value = init;
}
public synchronized void p()
{
while(value==0)
{
try
{
wait();
}
catch(InterruptedException e)
{
}
}
value--;
}
public synchronized void v()
{
value++;
notify();
}
}
Die ist denk ich (?) auch richtig so!
Jetzt die Message Queue mit den Semaphoren :
Java:
package fopt.assignment2b;
public class Buffer
{
private Semaphore sem1;
private Semaphore sem2;
private int[] data = null;
private int tail;
private int head;
private int numberOfElements;
public Buffer(int n)
{
if (n <= 0)
{
throw new IllegalArgumentException();
}
data = new int[n];
tail = 0;
head = 0;
numberOfElements = 0;
sem1 = new Semaphore(1);
sem2 = new Semaphore(0);
}
public void put(int x)
{
while (numberOfElements == data.length)
{
sem2.p();
}
sem1.p();
data[tail++] = x;
if (tail == data.length)
{
tail = 0;
}
numberOfElements++;
sem1.v();
sem2.v();
}
public int get()
{
while (numberOfElements == 0)
{
sem2.p();
}
sem1.p();
int result = data[head++];
if (head == data.length)
{
head = 0;
}
numberOfElements--;
sem1.v();
sem2.v();
return result;
}
}
Die funktioniert aber nicht ****
Vor allem meckert das System, dass ich eben die Semaphore nicht richtig benutze. Aber, ich brauch doch jeweils einen für den gegenseitigen Ausschluss der Methoden, sowie einen für den Produzenten und Konsumenten. Das müsste doch auch so stimmen, oder nicht?