Код Senior GIL, потоки и процессы обновлено

Найти риск взаимной блокировки

Условие

Дан список потоков, для каждого порядок захвата блокировок (поток держит все предыдущие, когда берёт следующую). Есть риск deadlock, если в графе «блокировка A взята раньше B в каком-то потоке» (ребро A -> B) есть цикл. Верните True, если риск есть.

Примеры

has_deadlock_risk([["a", "b"], ["b", "a"]]) // true
has_deadlock_risk([["a", "b"], ["a", "b"]]) // false
has_deadlock_risk([]) // false

Как подойти

Подсказки: 2
  1. Ребро A -> B для каждой пары «A взята раньше B» в одном потоке.
  2. Поиск цикла DFS с цветами.

Решите в тренажёре

Редактор с автотестами прямо в браузере. Можно решить спокойно, вслух или под таймером, как на собесе.