Взаимная блокировка (deadlock) возникает, когда несколько потоков ждут освобождения ресурсов друг от друга, и ни один не может продолжить работу. Для предотвращения deadlock применяются следующие подходы:
Каким образом предотвращается ситуация взаимной блокировки в многопоточных системах?
Взаимная блокировка (deadlock) возникает, когда несколько потоков ждут освобождения ресурсов друг от друга, и ни один не может продолжить работу. Для предотвращения deadlock применяются следующие подходы:
Короткий ответ
Что ответить на собеседовании
Подробный разбор
Ответ с пояснениями
Взаимная блокировка (deadlock) возникает, когда несколько потоков ждут освобождения ресурсов друг от друга, и ни один не может продолжить работу. Для предотвращения deadlock применяются следующие подходы:
- Избегание циклических зависимостей: гарантировать, что потоки захватывают ресурсы в одном и том же порядке.
- Использование таймаутов: при попытке захватить блокировку с таймаутом поток может отказаться и освободить уже захваченные ресурсы.
- Избегание вложенных блокировок: минимизировать количество одновременно захватываемых ресурсов.
- Алгоритмы обнаружения и восстановления: периодически проверять наличие взаимных блокировок и прерывать или перезапускать потоки.
Пример в Python с использованием упорядоченного захвата блокировок:
import threading
lock_a = threading.Lock()
lock_b = threading.Lock()
# Поток 1
with lock_a:
with lock_b:
# критическая секция
pass
# Поток 2
with lock_a: # Захватываем lock_a перед lock_b, чтобы избежать deadlock
with lock_b:
# критическая секция
pass
Здесь оба потока захватывают блокировки в одном и том же порядке, что предотвращает взаимную блокировку.