クリティカル セクションの 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(...);