2016-05-25 6 views
1

Я имею немного трудности в понимании алгоритма Питерсона: Алгоритм говорит:Сложность в понимании Алгоритм Петерсона

flag[i] = true; 
turn = j; 
while (flag[j] && turn == j); 
// critical section 
... 
// end of critical section 
flag[i] = false; 

Теперь давайте предположим, первоначально флаг [0] = флаг [1] = истинный

Если P1 запускается, он будет занят в цикле while, так как флаг [0] и turn == 0 оба будут true. Теперь, если P0 не хочет выполнять, P1 никогда не выполнит критический раздел.

Прошу прояснить мои сомнения, могут быть пробелы в моем понимании.

Благодаря

ответ

1

Теперь давайте предположим сначала флаг [0] = флаг [1] = истинный

Теперь, если P0 не хочет выполнять, P1 никогда не будет выполнять критическую секцию.

Оба флага должны быть инициализированы до false. Единственный способ, которым оба могут быть установлены на true, - это то, что оба процесса хотят выполнить или в настоящее время выполняют критический раздел. Поэтому, если P1 ожидает выполнения, flag[0] - true, поэтому P0 должен либо выполнить критический раздел, либо посередине его выполнения, после чего flag[0] будет установлен в false, а P1 может войти в критический раздел. Кроме того, если P1 ожидает выполнения, P0 также не может ждать выполнения, потому что условия ожидания являются взаимоисключающими (поскольку turn является либо 0, либо 1 и не может быть одновременно одновременно).

Инициализация обоих флагов до true может привести к тупику, как вы описали. Это не имеет смысла, поскольку значение флагов означает, что процесс хочет войти в критический раздел, поэтому, если это не так, зачем устанавливать это значение?

+0

Спасибо. Поэтому он должен быть инициализирован ложным. – anupamD

+0

Да, правильно. Инициализация как истины может привести к тупиковой ситуации. – samgak

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