semaphore
-
hallo komme nicht mehr weiter und zwar soll es möglich sein das auf eine siumlierte datenbank leser gleichzeitig zugreifen können aber nur einer schreiben kann.
mit nur einem leser und einem schreiber klappt es aber sobald ich mehrere leser verwende geht es nicht mehr da ich nicht weiss wie ich den schreiber blockieren kann bis alle leser fertig gelesen haben.
protected Semaphore semReader = new Semaphore(1);
ist eine eigene klasse mit der die anzahl zugriffe auf die Datenbank bestummen wird (momentan kann nur 1 leser zugreifen)
class Database{ protected static int rc = 0; protected static int wr = 0; protected Semaphore semReader = new Semaphore(1); protected Semaphore semWriter = new Semaphore(1); // Ein Lese-Prozess betritt die Datenbank. public void enterReader(int id) { semReader.down(); synchronized(getClass()){ ++rc; } System.out.println("Reader " + id + " betritt die Datenbank."); } // Ein Lese-Prozess verlässt die Datenbank. public void leaveReader(int id) { System.out.println("Reader " + id + " verläßt die Datenbank."); synchronized(getClass()){ --rc; } semReader.up(); } // Ein Schreibe-Prozess betritt die Datenbank. public void enterWriter(int id) { semWriter.down(); synchronized(getClass()){ ++wr; } System.out.println("Writer " + id + " betritt die Datenbank."); } // Ein Screibe-Prozess verläßt die Datenbank public void leaveWriter(int id) { System.out.println("Writer " + id + " verläßt die Datenbank."); synchronized(getClass()){ --wr; } semWriter.up(); } }
-
schonmal an einen globalen boolean gedacht fürs schreiben ?
setz ihn standartmäßig auf false. sobald einer schreibt wird der boolean auf true gesetz. jetz musst du nur noch für jeden user eine routine schreiben die prüft ob der boolean true oder false ist ( also if (boolean == true)....else warte z.b 10 s, oder so).je nachdem gibst du dann den zugang frei.pain
-
Wie sieht deine Semaphore-Klasse aus? Ist sie ähnlich dieser? [java]class Semaphore
{
/*
* Keep the value of the semaphore as well
* as the number of threads blocked.
*/
private int value;
private int waiters;/**
* Specify the initial value of the semaphore when it
* is created.
*/
Semaphore(int i)
{
value = i;
waiters = 0;
}/**
* Default semaphore has a value of zero.
*/
Semaphore()
{
this(0);
}/**
* Wait.
* If the count is not large enough, block
*/
public synchronized void wait(int count)
{
// Wait for value to get large enough
while(count > value) {
// Take everything available
count -= value;
value = 0;
waiters++;// Wait for someone to help us out
try {
this.wait();
}
catch(InterruptedException x) {
// Ignore this
}
finally {
waiters--;
}
}// Take out our bite
value -= count;// See if more will wake up
if(value != 0 && waiters != 0)
this.notify();
}/**
* Signal.
* Restart some threads if possible.
*/
public synchronized void signal(int count)
{
// Add to current value
value += count;
if(waiters != 0)
this.notify();
}
}[/code]