2016-11-17 1 views
0

나는 Dekker 's Algorithm으로 간단한 프로그램을하려고하는데, 3 개의 프로세스가있다. 내 코드는 다음과 같습니다.Dekker 's Algorithm for 3 processes (작동하지 않는다)

class DekkerAlg { 

static final int iter = 2000000; 
static volatile int sharedResource = 0; 
/* Thread P wants to enter in the CS */ 
static volatile boolean wantp = false; 
/* Thread Q wants to enter in the CS */ 
static volatile boolean wantq = false; 
/* Thread R wants to enter in the CS */ 
static volatile boolean wantr = false; 
/* Who's next? */ 
static volatile int turn = 1; 

    class P extends Thread { 
     public void run() { 
      for (int i=0; i<iter; ++i) { 
       wantp = true; 
       while (wantq || wantr) { 
        if (turn == 2 || turn == 3) { 
         wantp = false; 
         while (turn == 2 || turn == 3) 
          Thread.yield(); 
         wantp = true; 
        } 
       } 

       ++sharedResource; 

       turn = 2; 
       wantp = false; 
      } 
     } 
    } 

    class Q extends Thread { 
     public void run() { 
      for (int i=0; i<iter; ++i) { 
       wantq = true; 
       while (wantp || wantr) { 
        if (turn == 1 || turn == 3) { 
         wantq = false; 
         while (turn == 1 || turn == 3) 
          Thread.yield(); 
         wantq = true; 
        } 
       } 

       --sharedResource; 

       turn = 3; 
       wantq = false; 
      } 
     } 
    } 

    class R extends Thread { 
     public void run() { 
      for (int i=0; i<iter; ++i) { 
       wantr = true; 
       while (wantp || wantq) { 
        if (turn == 1 || turn == 2) { 
         wantr = false; 
         while (turn == 1 || turn == 2) 
          Thread.yield(); 
         wantr = true; 
        } 
       } 

       ++sharedResource; 

       turn = 1; 
       wantr = false; 
      } 
     } 
    } 

    DekkerAlg() { 
     Thread p = new P(); 
     Thread q = new Q(); 
     Thread r = new R(); 
     p.start(); 
     q.start(); 
     r.start(); 

     try { 
      p.join(); 
      q.join(); 
      r.join(); 
      System.out.println("Shared Resource value: " + sharedResource); 
      System.out.println("Should be 2000000."); 
     } 
     catch (InterruptedException e) {} 
    } 

    public static void main(String[] args) { 
     new DekkerAlg(); 
    } 
} 

내 코드가 100 % 맞는지 확실하지 않습니다. P가 CS에 들어가기를 원한다면, 먼저 Q 또는 R이 진입하려고하는지 확인해야하며, 자신의 차례가 아니라면 기다린다. 2000000 반복와 스레드 Q와 R.

  • 와 같은 절차 : 프로그램 200 반복으로
  • 에게 작동하지 않습니다 프로그램은 때때로

작동 내가 데커의 알고리즘이 작동하지 않는 것 같아요 3 프로세스하지만 내 코드가 올바른지, 왜 내 프로그램이 실패 하는지를 알아야합니다.

감사합니다. 그것에 대해

+0

'작동하지 않습니다'라는 진술에 대한 귀하의 의견을 설명해주십시오. 두 경쟁자를 넘어서 확장하기 어려운 한 가지는 '턴'입니다 : 당신이 지명 한 사람이 다시 경쟁 할 것이라는 것을 어떻게 알 수 있습니까? ("외부 대기 루프"가 입력 될 때마다 사소한 ...) (동일한 소스 코드의 세 사본에 대해 심각하게 생각할 수는 없습니다.) – greybeard

+0

"작동하지 않는다"고 말하면 나는 프로그램이 ' 마침. 나는 그 알고리즘이 3 가지 프로세스에 대한 상호 배제를 해결하는 것은 적절하지 않다는 것을 알고 있지만 전체 알고리즘을 변경하지 않고 그것을 시도하는 가장 좋은 방법을 알고 싶다. 나는 자바에서 시작하고 영어가 아니기 때문에 설명하기가 어렵습니다. 나는 당신이 그것을 이해하기 바래, 나는 단지 향상시키고 자한다. – Repikas

+0

'내가 말할 때 "프로그램이 끝나지 않는다고 말하고 싶습니다."어떤 의미로든, 다음과 같이하십시오 : _ 게시물을 수정하십시오. ('i'에 대해 경고해야하는 맞춤법 검사기를 사용하십시오.) ('나는 영어가 아니기 때문에 나에게 어려움이있다.' '나는 계속 _Decker_를 타이핑했다. 그리고 대부분의 버스 타기는 버스를 타고왔다. [TET] (https://nl.wikipedia.org/wiki/Twentsche_Electrische_Tramweg_Maatschappij) – greybeard

답변

0

알고리즘의 특정 구현이 작동하는지 아이디어를 얻을려고, 이유 또는 테스트  을 ("증거"    정확성의).
구현시 Q에 에 P의 ID를 할당하고 R을 (인스턴스화, 시작 및) 참여시키지 마십시오.
하나의 실행 가능한 클래스의 인스턴스를 사용하는 리팩토링 : volatile유형[]유형의 배열 휘발성 참조를 선언 - 당신이 뭔가를해야합니다.

세 개 이상의 프로세스가있는 경우 확장자가 없으면 turn을 다른 값 (완료 또는 종료)으로 설정하지 않는 프로세스의 ID로 설정하고 다른 프로세스 완료 또는 종료되지 않았습니다.


어려운 부분은 mutual exclusion for 3 processes […] without [changing Dekker's] entire algorithm 될 것이다 - 당신이 뮤텍스 구현의 역사를 되돌아 자신을 찾을 수 있습니다.
초기 모델은 JVM Memory Model과는 다른 많은 메모리 모델로 만들어졌습니다.

+0

(내가'휘발성 '배열에 대한 주석을 삽입하게 만드는 이유는 무엇입니까?) – greybeard

+0

'Early one' -'s'가 누락되었습니다. 어쨌든 아마도 초기 MutEx 구현은 아마도 더 좋을 것입니다. – greybeard