2012-04-10 17 views
1

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

  1. Ein Vektor V [] von booleans. V [i] ist "True", wenn Pi den kritischen Abschnitt verwenden muss.
  2. 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.
  3. Ein spezieller Scheduler-Prozess SCHED wird immer dann verwendet, wenn ein blockierter Prozess zur Verwendung des kritischen Abschnitts aktiviert werden muss.
  4. SCHED durch das Warten auf eine spezielle Semaphore S
  5. 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].
  6. 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.
  7. 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!

+3

'Viele Fehler' wie was? – EJP

+0

viel Nullpointerexzeption. das ist eigentlich der einzige Fehler, den ich im Moment bekomme – NuNu

+0

Ein Stacktrace ist normalerweise sehr hilfreich bei der Suche nach dem Problem in solchen Fällen. – trutheality

Antwort

4

Ihre NPE ist wahrscheinlich aufgrund der Tatsache, dass Sie nie Ihre Semaphore-Array initialisieren - aber es ist schwer, ohne eine richtige Stack-Trace zu sagen.

Zwei Stücke der Beratung:

1) Sie könnten Ihren Klassenvariablen sinnvolle Namen geben wollen als: in 4 Monaten B N S V. von diesem Projekt und Neubetrachtung es Stellen zu Fuß entfernt und musste das durchlesen.

2) Finden Sie Ihr Klassenmodell auf einer weißen Tafel, bevor Sie einen Code schreiben. Sie haben Methoden, die Semaphoren mit demselben Namen wie einige Ihrer statischen Felder verwenden. Wie sind die Beziehungen der Objekte in Ihrem Programm? Wenn Sie nicht wissen, Quoten Ihr Programm weiß es auch nicht.

+0

danke für diese Vorschläge. Gibt es noch etwas, was Sie vorschlagen, dass ich tun, weil ich völlig ratlos bin – NuNu

+0

Haben Sie versucht, die Semaphore-Array zu initialisieren? Fügen Sie Ihre Stack-Trace in der Frage –

+0

ahhhh ich habe es tatsächlich herausgefunden. Ich habe es jetzt mit dem Array-Index zu tun, aber es ist ein Haufen – NuNu