2012-04-10 3 views
1

Я пишу программу на Java, которая занимается семафорами для задания. Я все еще новичок в идее семафоров и параллелизма. Описание проблемы:Семафоры: критический раздел с приоритетами

  1. Вектор V [] булевых. V [i] является «True», если Pi необходимо использовать критический раздел.
  2. Вектор двоичных семафоров B [], чтобы блокировать процессы от входа в их критический раздел: B [i] будет процессом блокировки семафора Pi.
  3. Специальный процесс планировщика SCHED используется всякий раз, когда необходимо активировать заблокированный процесс для использования критического раздела.
  4. SCHED заблокирован ожиданием на специальном семафоре S
  5. Когда процесс Pi должен войти в критический раздел, он устанавливает V [i] в ​​значение «True», сигнализирует семафор S, а затем ждет на семафоре B [ я].
  6. Всякий раз, когда SCHED разблокируется, он выбирает процесс Pi с наименьшим индексом i, для которого V [i] является «True». Процесс Пи затем разбужена сигнализация B [I] и Sched возвращается в режим сна путем блокирования на семафоре С.
  7. Когда процесс Pi покидает критическую секцию, она сигнализирует С.

Это мой код:

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(); 
     } 
     } 
    } 

Я считаю, что моя логика верна, но я получаю много ошибок (например, исключение в нити java.lang.NullPointerException «Thread-1»). Может ли кто-нибудь пролить свет на то, что я делаю неправильно? & предоставил мне некоторую помощь. Это очень ценится!

+3

«Много ошибок», например, что? – EJP

+0

много nullpointerexception. это на самом деле единственные ошибки, которые я получаю в данный момент. – NuNu

+0

Обычно стекловидная задача помогает найти проблему в таких случаях. – trutheality

ответ

4

Возможно, ваш NPE связан с тем, что вы никогда не инициализируете массив семафора, но его трудно сказать без правильной трассировки стека.

Два куска советы:

1) Вы можете дать вашим переменным класса более осмысленные имена, чем: B N S В. Представьте отходя от этого проекта и пересмотр его в 4-х месяцев и должен был прочитать это.

2) Перед тем, как писать какой-либо код, выпишите свою модель класса на белой доске. У вас есть методы, которые используют семафоры с тем же именем, что и некоторые ваши статические поля. Каковы отношения объектов в вашей программе? Если вы не знаете, вероятность того, что ваша программа тоже не знает.

+0

спасибо за эти предложения. есть ли что-нибудь еще, что вы предлагаете мне сделать, потому что я полностью запятнал – NuNu

+0

Пробовал ли инициализировать массив Семафор? Вставьте трассировку стека в вопрос –

+0

ahhhh, я понял это на самом деле. я имею дело с индексом массива, находящимся за пределами границ теперь, но благодаря группе – NuNu

Смежные вопросы