Ich schreibe ein Programm in Java, das Semaphoren für eine Aufgabe behandelt. Ich bin noch neu in der Idee von Semaphoren und Nebenläufigkeit. Die Beschreibung des Problems lautet wie folgt:Semaphoren: Kritischer Abschnitt mit Prioritäten
- Ein Vektor V [] von booleans. V [i] ist "True", wenn Pi den kritischen Abschnitt verwenden muss.
- Ein Vektor von binären Semaphoren B [], um Prozesse daran zu hindern, in ihren kritischen Abschnitt einzutreten: B [i] wird der Semaphor-Blockierungsprozess Pi sein.
- Ein spezieller Scheduler-Prozess SCHED wird immer dann verwendet, wenn ein blockierter Prozess zur Verwendung des kritischen Abschnitts aktiviert werden muss.
- SCHED durch das Warten auf eine spezielle Semaphore S
- Wenn ein Prozess Pi eingeben muss den kritischen Abschnitt blockiert wird, setzt es V [i] auf „True“, die S Semaphore signalisiert und wartet dann auf die Semaphore B [ ich].
- Wann immer SCHED entsperrt wird, wählt es den Prozess Pi mit dem kleinsten Index i, für den V [i] "True" ist. Prozess Pi wird dann aufgeweckt durch B Signalisierung [i] und SCHED schlafen geht zurück durch Blockierung auf Semaphor S.
- Wenn ein Prozess Pi den kritischen Abschnitt verlässt, signalisiert er S.
Dieser meinen Code ist:
import java.util.concurrent.Semaphore;
public class Process extends Thread {
static boolean V[];
int i;
static Semaphore B[]; //blocking semaphore
static Semaphore S;
private static int id;
static int N;
static int insist = 0;
public static void process (int i, int n) {
id = i;
N = n;
V = new boolean[N];
}
private void delay() {
try {
sleep (random(500));
}
catch (InterruptedException p) {
}
}
private static int random(int n) {
return (int) Math.round(n * Math.random() - 0.5);
}
private void entryprotocol(int i) {
V[Process.id] = true;
int turn = N;
while (V[Process.id] == true && turn == N) {
System.out.println("P" + Process.id + " is requesting critical section");
signal(S);
}
critical(Process.id);
wait(B[Process.id]);
V[Process.id] = false;
}
private void wait(Semaphore S) {
if (Process.id > 0) {
Process.id--;
} else {
//add Process.id to id.queue and block
wait(B[Process.id]);
}
}
private void signal(Semaphore S) {
if (B[Process.id] != null) {
Sched(Process.id);
} else {
Process.id++; //remove process from queue
critical(Process.id); //wakes up current process
}
}
private void critical(int i) {
System.out.println("P" + Process.id + " is in the critical section");
delay();
exitprotocol(i);
}
private void exitprotocol(int i) {
System.out.println("P" + Process.id + " is leaving the critical section");
V[id] = false;
signal(S);
}
public void Sched(int i) {
if (B[Process.id] == null) {
signal(B[Process.id]);
}
wait(S);
}
public void run() {
for (int i = 0; i < 5; i++) {
Sched(i);
entryprotocol(Process.id);
try {
wait(Process.id);
}
catch (InterruptedException p) {
}
signal(S);
}
}
public static void main (String[] args) {
int N = 5;
Process p[] = new Process[N];
for (int i = 0; i < N; i++) {
p[i] = new Process();
p[i].start();
}
}
}
ich glaube, meine Logik hier richtig ist, aber ich bin eine Menge Fehler (wie Exception in thread „Thread-1“ java.lang.NullPointerException) zu bekommen. Kann irgendjemand etwas Licht auf das werfen, was ich falsch mache & versorge mich mit etwas Hilfe. Es wird sehr geschätzt!
'Viele Fehler' wie was? – EJP
viel Nullpointerexzeption. das ist eigentlich der einzige Fehler, den ich im Moment bekomme – NuNu
Ein Stacktrace ist normalerweise sehr hilfreich bei der Suche nach dem Problem in solchen Fällen. – trutheality