Наверх Системное программирование
Предыдущий раздел Оглавление Следующий раздел

3.3.3.2. Блокирующие переменные

В качестве второй попытки рассмотрим программное решение, в котором используется одна общая (блокирующая) переменная, исходное значение которой равно нулю. Когда процессу требуется войти в свою критическую область, сначала он проверяет значение блокирующей переменной. Если оно равно 0, процесс устанавливает его в 1 и входит в критическую область. Если значение уже равно 1, процесс просто ждет, пока оно не станет равно нулю. Таким образом, нулевое значение показывает, что ни один из про¬цессов не находится в своей критической области, а единица — что какой-то процесс находится в своей критической области.

К сожалению, реализация этой идеи приводит к точно такому же фатальному исходу, который мы уже видели в примере с каталогом спулера. Предположим, что один про¬цесс считывает значение блокирующей переменной и видит, что оно равно нулю. Перед тем как он сможет установить значение в единицу, планировщик запускает другой процесс, который устанавливает значение в единицу. Когда возобновляется выполнение первого процесса, он также установит значение блокирующей переменной в единицу, и два процесса одновременно окажутся в своих критических областях.

Предыдущий раздел Оглавление Следующий раздел