Ответ
Deadlock (взаимная блокировка) — это ситуация в многопоточном программировании, когда два или более потока заблокированы, каждый ожидает освобождения ресурса, удерживаемого другим, создавая циклическую зависимость.
Классический пример на C++ с std::mutex:
#include <thread>
#include <mutex>
#include <chrono>
std::mutex mutex1, mutex2;
void thread1_work() {
std::lock_guard<std::mutex> lock1(mutex1); // Захватываем mutex1
std::this_thread::sleep_for(std::chrono::milliseconds(1)); // Имитация работы
std::lock_guard<std::mutex> lock2(mutex2); // Блокировка: ждём mutex2, который у thread2
// Критическая секция 1&2
}
void thread2_work() {
std::lock_guard<std::mutex> lock2(mutex2); // Захватываем mutex2
std::this_thread::sleep_for(std::chrono::milliseconds(1));
std::lock_guard<std::mutex> lock1(mutex1); // Блокировка: ждём mutex1, который у thread1
// Критическая секция 2&1
}
// Запуск t1 и t2 приведёт к deadlock.
Способы предотвращения, которые я применяю:
- Упорядоченная блокировка: Всегда захватывать мьютексы в одном и том же глобальном порядке (напр., сначала
mutex1, потомmutex2). - Использование
std::lock: Стандартная функция, которая безопасно захватывает несколько мьютексов, избегая deadlock.std::lock(mutex1, mutex2); // Атомарно захватывает оба std::lock_guard<std::mutex> lk1(mutex1, std::adopt_lock); std::lock_guard<std::mutex> lk2(mutex2, std::adopt_lock); - Избегание вложенных блокировок: Перепроектирование кода, чтобы уменьшить необходимость удерживать несколько мьютексов.
- Использование
std::scoped_lock(C++17): Более современная и безопасная заменаstd::lock_guardдля нескольких мьютексов.std::scoped_lock lock(mutex1, mutex2); // Deadlock-free захват
Видео-ответы
▶
Реальное Техническое Собеседование с ВК на Senior Php Разработчика
▶
СОБЕСЕДОВАНИЕ В АУТСОРС НА SENIOR РАЗРАБОТЧИКА - 330К
▶
Реальное собеседование Senior iOS разработчика. Виталий Кузьменко / Мобильный разработчик
▶
Middle Java разработчик удивил на собеседовании знаниями уровня Senior!
▶
Тестовое интервью в МТС на Middle Java
▶
Тестовое интервью в Oracle на middle Java
▶
Разбираем многопоточку на middle java в формате открытого собеседования
▶
Открытое собеседование на Golang разработчика
▶
Публичное собеседование: middle iOS-разработчик [Хекслет + Podlodka iOS Crew]
▶
Техническое собеседование Java Developer | ТОП вопросов за 90 минут | от ООП до микросервисов
▶
Собеседование на Java-разработчика, вопросы для подготовки: finalize method, ArrayList, REST и SOAP
▶
Собеседование на .NET разработчика (backend)
▶
Собеседование на .NET разработчика (backend)
▶
Открытое интервью на Go разработчика | Эйч Навыки
▶
Моковое собеседование на Junior iOS-разработчика| Екатерина Батеева, Одноклассники
▶
Mock-собеседование старшего Go разработчика из Тинькофф | Самое полное интервью
▶
Mock-собеседование на позицию Java Junior | Джун справится?
▶
Собеседование Junior Android разработчика на ОФФЕР в РЕАЛЬНОМ времени / Мобильный разработчи
▶
Mock-собеседование на позицию Java Developer | Идеальный кандидат
▶
Live-собеседование на Java-разработчика. Нанимающий менеджер - Вадим Бескровнов
▶
Собеседование Java Junior | Jetbulb
▶
Групповое собеседование на Junior и Middle Java разработчика
▶
Техническое интервью Java Developer - Алексей Гумен