Deadlock происходит, когда все следующие четыре условия одновременно присутствуют в программе:
Взаимное исключение требует, чтобы ресурс мог быть доступен только одному потоку за раз. Ресурсы не могут использоваться одновременно несколькими потоками, что заставляет потоки ждать эксклюзивного доступа.
Удержание ресурса происходит, когда поток удерживает один ресурс и одновременно пытается захватить другой взаимно исключающий ресурс. Поток отказывается освобождать текущий ресурс, пока ждёт дополнительного.
Отсутствие вытеснения означает, что нет механизма для принудительного освобождения ресурсов, удерживаемых потоком, по истечении определённого времени. Ресурсы могут быть освобождены только добровольно — самим потоком, который их захватил.
Циклическое ожидание происходит, когда два или более потока образуют цикл зависимостей. Каждый поток удерживает один ресурс и ждёт, пока освободится ресурс другого потока, формируя циклическую цепочку ожидания.
Все четыре условия должны выполняться одновременно, чтобы возник deadlock. Если устранить хотя бы одно из них, deadlock невозможен. Это важно понимать при проектировании систем без deadlock'ов — через грамотное распределение ресурсов, упорядочивание блокировок или механизмы таймаутов.
Deadlock может произойти в программе даже если присутствуют только три из четырёх необходимых условий, при условии что они образуют циклическую зависимость.
Новый — ещё не проверен сообществом
Вы