2015-07-01 2 views
2

будет Peterson's Algorithm работы после переворота указаний поворота и флага; например:Алгоритм Петерсона с некоторыми изменениями

P0: 
    turn = 1; 
    flag[0] = true; 
     while (flag[1] && turn == 1) 
     { 
      // busy wait 
     } 
     // critical section 
     ... 
     // end of critical section 
     flag[0] = false; 

=================

P1: 
    turn = 0; 
    flag[1] = true; 
     while (flag[0] && turn == 0) 
     { 
      // busy wait 
     } 
     // critical section 
     ... 
     // end of critical section 
     flag[1] = false; 

ответ

1

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

Например, предположим, что начальное состояние, в котором flag[0] = false, flag[1] = false, turn = 0:

Процесс 0 пробеги:

turn = 1; // flag[0] = false, flag[1] = false, turn = 1 

Затем переключение контекста процессу 1:

turn = 0; 
flag[1] = true; // flag[0] = false, flag[1] = true, turn = 0 

while (flag[0] && turn == 0) {} // this evaluates to false because 
    // process 0 was interrupted before it set flag[0] to true 

// Process 1 enters the critical section... 

Затем переключение контекста снова обработать 0 :

flag[0] = true; // flag[0] = true, flag[1] = true, turn = 0 
while (flag[1] && turn == 1) {} // this evaluates to false 

// Process 0 enters the critical section.. 

Теперь оба процесса находятся внутри критической секции.

Установка знака должна быть первой, потому что это то, что другой процесс не может перезаписать. Если процесс устанавливает turn, то, как показано выше, другой процесс может перезаписать его, а затем ввести критический раздел, прежде чем первый процесс получит возможность установить флаг.

Смежные вопросы