Вот два алгоритма для критической секции. Первый не удовлетворяет прогрессивному требованию, а второй является решением. Я думаю, что есть проблема со вторым, но мой лектор этого не признал. Нам нужно как-то присвоить повороту новое значение после того, как каждый процесс входит в раздел напоминания? Это правильно?
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(...);