0

クリティカル セクションの 2 つのアルゴリズムを次に示します。最初のものは進歩的な要件を満たしていません.2番目のものは解決策です. 2 番目の問題があると思いますが、私の講師はそれを認めませんでした。各プロセスがリマインダー セクションに入った後、どうにかしてターンを新しい値に割り当てる必要がありますか? そうですか?

boolean flag[2];
initially flag [0] = flag [1] = false.
flag [i] = true 
//Pi ready to enter its critical section
//Process Pi
do {
   flag[i] = true;
   while (flag[j]) ;
   critical section
   flag [i] = false;
   remainder section
} while ( … );

それは相互排除を満たしますが、進歩はしません。これをこれに変更することで、進歩の必要性を満たします。

int turn;
boolean flag[2];
initially flag [0] = flag [1] = false, turn = i (or j)
Process Pi
do {
   flag [i] = true;
   turn = j;
   while (flag [j] and turn = j) ;
   critical section
   flag [i] = false;
remainder section
while(...);
4

1 に答える 1

1

2番目のアルゴリズムは、書かれているとおり正しいです。

このturn変数は、両方のプロセスが互いのフラグを待機している間のみ関連します。

クリティカル セクションを終了するときにリセットする必要はありませんturn。クリティカル セクションに入ろうとする次のプロセスによって値が再度テストされる前にリセットされるためです。

于 2013-11-12T04:21:19.410 に答える