В алгоритме Деккера предлагается объединение предложений вариантов 1 и 4 решения проблемы взаимоисключения.
int ProcessNum=1; // номер процесса для доступа
к ресурсу
int ResourceProc1 = 0; // = 1 – ресурс занят
процессом 1
int ResourceProc2 = 0; // = 1 – ресурс занят
процессом 2
Process_1() {
while (1) {
ResourceProc1 = 1; // процесс 1 пытается занять ресурс
/* цикл ожидания доступа к ресурсу */
while ( ResourceProc2 == 1 ) {
if ( ProcessNum == 2 ) {
ResourceProc1 = 0;
// повторять, пока ресурс занят процессом 2
while ( ProcessNum == 2 );
ResourceProc1 = 1;
}
}
< Использование общего ресурса >
ProcessNum = 2;
ResourceProc1 = 0;
}
}
Process_2()
{
while (1) {
ResourceProc2 = 1; // процесс 2 пытается занять ресурс
/* цикл ожидания доступа к ресурсу */
while ( ResourceProc1 == 1 ) {
if ( ProcessNum == 1 ) {
ResourceProc2 = 0;
// повторять, пока ресурс используется процессом 1
while ( ProcessNum == 1 );
ResourceProc2 = 1;
}
}
< Использование общего ресурса >
ProcessNum = 1;
ResourceProc2 = 0;
}
}
Алгоритм Деккера гарантирует корректное решение проблемы взаимоисключения для двух процессов. Управляющие переменные ResourceProc1, ResourceProc1 обеспечивают взаимоисключение, переменная ProcessNum исключает возможность бесконечного откладывания. Если оба процесса пытаются получить доступ к ресурсу, то процесс, номер которого указан в ProcessNum, продолжает проверку возможности доступа к ресурсу (внешний цикл ожидания ресурса). Другой же процесс в этом случае снимает свой запрос на ресурс, ожидает своей очереди доступа к ресурсу (внутренний цикл ожидания) и возобновляет свой запрос на ресурс.
Алгоритм Деккера может быть обобщен на случай произвольного количества процессов (см. [16]), однако, такое обобщение приводит к заметному усложнению выполняемых действий. Кроме того, программное решение проблемы взаимоисключения процессов приводит к нерациональному использованию процессорного времени ЭВМ (процессу, ожидающему освобождения ресурса, постоянно требуется процессор для проверки возможности продолжения – активное ожидание (busy wait)).