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