Алгоритм критического раздела для удовлетворения хода процессов путем сравнения двух алгоритмов?

Вот два алгоритма для критической секции. Первый не удовлетворяет прогрессивному требованию, а второй является решением. Я думаю, что есть проблема со вторым, но мой лектор этого не признал. Нам нужно как-то присвоить повороту новое значение после того, как каждый процесс входит в раздел напоминания? Это правильно?

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(...);

person Bernard    schedule 12.11.2013    source источник


Ответы (1)


Второй алгоритм правильный, как написано.

Переменная turn актуальна только в то время, когда оба процесса ожидают установления флагов друг друга.

Нет необходимости сбрасывать turn при выходе из критической секции, потому что она будет сброшена перед повторной проверкой ее значения — следующим процессом, который попытается войти в критическую секцию.

person A. I. Breveleri    schedule 12.11.2013