MiddleДебаггингИногдаЕщё не отвечали
Почему эти две блокировки могут привести к дедлоку?
Два потока выполняют t1 и t2 одновременно, и программа иногда зависает навсегда.
import threading
a = threading.Lock(); b = threading.Lock()
def t1():
with a:
with b: ...
def t2():
with b:
with a: ...
Найдите и исправьте ошибку.
Инверсия порядка блокировок: t1 берёт a, затем b, а t2 — b, затем a. Если каждый захватит свою первую блокировку одновременно, второй не достанется никому → дедлок. Решение: захватывать блокировки в едином глобальном порядке или использовать таймаут (lock.acquire(timeout=...)).
- ✗Считать, что короткие критические секции не могут привести к дедлоку
- ✗Путать это с повторным захватом одной нереентерабельной блокировки
- ✗Винить GIL, а не инвертированный порядок блокировок
- →Почему единый согласованный глобальный порядок блокировок предотвращает дедлок?
- →Как захват с таймаутом позволяет потоку выйти из возможного дедлока?