Возможная попытка в восстановлении взаимоисключения может состоять в установке значений управляющих переменных перед циклом проверки занятости ресурса.
int ResourceProc1 = 0; // = 1 – ресурс занят процессом 1
int ResourceProc2 = 0; // = 1 – ресурс занят процессом 2
Process_1() {
while (1) {
// установить, что процесс 1 пытается занять ресурс
ResourceProc1 = 1;
// повторять, пока ресурс занят процессом 2
while ( ResourceProc2 == 1 );
< Использование общего ресурса >
ResourceProc1 = 0;
}
}
Process_2()
{
while (1) {
// установить, что процесс 2 пытается занять ресурс
ResourceProc2 = 1;
// повторять, пока ресурс используется процессом 1
while ( ResourceProc1 == 1 );
< Использование общего ресурса >
ResourceProc2 = 0;
}
}
Представленный вариант восстанавливает взаимоисключение, однако при этом возникает новая проблема – оба процесса могут оказаться заблокированными вследствие бесконечного повторения циклов ожидания освобождения ресурсов (что происходит при одновременной установке управляющих переменных в состояние "занято"). Данная проблема известна под названием ситуации тупика (дедлока или смертельного объятия) и исключение тупиков является одной из наиболее важных задач в теории и практике параллельных вычислений. Более подробное рассмотрение темы будет выполнено далее в пп. 5.5 и 5.6; дополнительная информация по проблеме может быть получена в [6,13].