Я начал изучать проблему критических разделов и ее различные решения.Чтобы объяснить мой вопрос, позвольте мне сначала дать краткую справку об этом.
Общая структура для решения двух процессов для задачи критического сечения - алгоритм 1:
turn = 0;
do
{
while (turn != 0) ; //if not P0's turn , wait indefinitely
// critical section of Process P0
turn = 1; //after P0 leaves critical section, lets P1 in
//remainder section
} while (1); //loop again
Проблема сэтот алгоритм заключается в том, что он не поддерживает необходимое требование прогресса.Это заставляет критическую секцию в равных оборотах принадлежать P0 -> P1 -> P0 -> P1 -> ... Чтобы преодолеть эту проблему, используется алгоритм 2, где переменная переменная заменяется массивом flag[]
.Общая структура алгоритма 2:
do
{
flag[0] = T ;
while (flag[1]);//if flag[1] is true wait indefinitely
// critical section of Process P0
flag [0] = F; //P0 indicated it no longer needs to be in critical section
//remainder section
} while (1); //loop again
Здесь процесс может многократно выполнять свою критическую секцию, если это необходимо.(Хотя этот алгоритм тоже не поддерживает прогресс)
Теперь мой вопрос, почему мы не можем использовать переменную turn внутри цикла do-while в алгоритме 1 так же, как мы используем переменную flag[]
в алгоритме 2?Ниже приведен код, объясняющий, что я имею в виду: для процесса 0:
do
{
turn = 0;
while (turn != 0) ; //if not P0's turn , wait indefinitely
// critical section of Process P0
turn = 1; //after P0 leaves critical section, lets P1 in
//remainder section
} while (1); //loop again
для процесса 1:
do
{
turn = 1;
while (turn != 1) ; //if not P0's turn , wait indefinitely
// critical section of Process P0
turn = 0; //after P1 leaves critical section, lets P0 in
//remainder section
} while (1); //loop again
Разве приведенный выше код не позволяет процессу многократно выполнять свою критическую секцию,если нужно и, следовательно, решить проблему в алгоритме 1?Я знаю, что здесь что-то не так, иначе это решение использовалось бы вообще, просто не знаю точно, что это такое.