1

Dining-Philosopher 's Monitor 솔루션 :`pickup (i)`이`self [i] .signal() '을 간접적으로 호출해야합니까? 운영 체제의 개념에서

5.8.2 식사하는 철학자 솔루션 사용하여 모니터

다음으로, 우리는 식사하는 철학자 문제에 교착없는 솔루션을 제시하여 모니터의 개념을 설명. 이 솔루션은 중 하나만 사용할 수있는 경우에만 철학자가 그녀의 젓가락을 집어들 수 있다는 제한을 적용합니다 ( ). 이 솔루션을 코딩하려면 우리는 철학자를 찾을 수있는 세 가지 상태 중 을 구별해야합니다. 그녀의 두 이웃 식사를하지 않는 경우에만 내가 변수 state[i] = EATING를 설정할 수 있습니다

enum {THINKING, HUNGRY, EATING} state[5]; 

철학자 : (state[(i+4) % 5] != EATING)(state[(i+1) % 5] != EATING)을이 목적을 위해, 우리는 다음과 같은 데이터 구조를 소개합니다.

우리는 또한이 그녀가 배고파 그러나 그녀가 필요로하는 젓가락을 얻을 수없는 때 내가 자신을 지연 철학자 할 수

condition self[5]; 

선언해야합니다.

monitor DiningPhilosophers 
{ 

    enum {THINKING, HUNGRY, EATING} state[5]; 
    condition self[5]; 
    void pickup(int i) { 

     state[i] = HUNGRY; 
     test(i); 
     if (state[i] != EATING) 
      self[i].wait(); 

    } 
    void putdown(int i) { 

     state[i] = THINKING; 
     test((i + 4) % 5); 
     test((i + 1) % 5); 

    } 
    void test(int i) { 

     if ((state[(i + 4) % 5] != EATING) && 
     (state[i] == HUNGRY) && 
     (state[(i + 1) % 5] != EATING)) { 
      state[i] = EATING; 
      self[i].signal(); 
     } 

    } 
    initialization code() { 

     for (int i = 0; i < 5; i++) 
      state[i] = THINKING; 
    } 

} 

그림 5.18 식당 철학자 문제에 대한 모니터 솔루션.

각 철학자는 먹기 시작하기 전에 작업을 호출해야합니다. pickup(). 이 행위는 철학자 과정의 정지를 초래할 수 있습니다. 수술이 성공적으로 완료되면 철학자가 식사를 할 수 있습니다. 그런 다음 철학자가 putdown() 작업을 호출합니다. 조건이 충분 때 회전에 self[i].signal()를 호출

DiningPhilosophers.pickup(i); 
... 
eat 
... 
DiningPhilosophers.putdown(i); 

pickup(i) 전화 test(i). pickup(i)self[i].signal()을 간접적으로 호출해야합니까?

감사합니다.

+0

아니요 신호가 손실되었지만 ** putdown (i)에서 중요합니다 ** – yakout

답변

1

signal()에 대한 호출은 현재 스레드에 신호를 보내기 때문에 픽업 중에 아무런 영향을 미치지 않습니다. 정의에 따라 대기 상태에있을 수 없습니다.