1

Dining-Philosopher's Monitorの解決策: `pickup(i)`は `self [i] .signal()`を間接的に呼び出す必要がありますか?オペレーティングシステムの概念から

5.8.2ダイニング・哲学者・ソリューションの使用モニター

次に、我々はダイニング哲学者問題へのデッドロックフリー ソリューションを提示することによって、モニターの概念を説明します。この解決法は、 の両方が利用可能である場合にのみ、哲学者が彼女の箸を拾う可能性があるという制限を課している( )。この解をコード化するためには、哲学者を見つけ出す可能性がある3つの州の中で を区別する必要があります。彼女の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()へのコールは、現在のスレッドに信号を送るため、ピックアップ中に何の効果もありません。このスレッドは、定義では待機状態にはなりません。

関連する問題