Взаимоблокировка — это состояние, при котором два или более потока каждый вечно ждут ресурс, который удерживают другие, так что ни один не может продолжить. Для неё требуется одновременное выполнение четырёх условий (условия Коффмана).
Взаимоблокировка — это состояние, при котором два или более потока каждый вечно ждут ресурс, который удерживают другие, так что ни один не может продолжить. Для неё требуется одновременное выполнение четырёх условий (условия Коффмана).
Нарушьте любое одно — и взаимоблокировка невозможна.
Поток 1 удерживает A, хочет B ─┐
├─ циклическое ожидание → взаимоблокировка
Поток 2 удерживает B, хочет A ─┘
# ВЗАИМОБЛОКИРОВКА: потоки блокируют в противоположном порядке
def t1():
with lockA:
with lockB: ... # T1: A потом B
def t2():
with lockB:
with lockA: ... # T2: B потом A ← цикл!
# ИСПРАВЛЕНИЕ: навязать глобальный порядок блокировок (всегда A перед B)
def safe():
with lockA:
with lockB: ... # все захватывают в одном и том же порядке
tryAcquire(timeout), отступить и повторить — нарушает удержание-и-ожидание.Взаимоблокировки замораживают системы тихо — без сбоя, просто зависшие запросы. Называние четырёх условий показывает, что вы умеете рассуждать о том, почему это происходит, и выбирать целенаправленное предотвращение (обычно согласованный порядок блокировок), а не рассыпать блокировки в надежде на удачу.
Библиотека вопросов для IT-собеседований с подробными ответами — от Junior до Senior.
Поддержать