Взаимная блокировка (deadlock) — ситуация, когда два или более потока или процесса навсегда блокируют друг друга, ожидая освобождения ресурсов, занятых друг другом.
Приходилось ли вам использовать механизмы взаимной блокировки для синхронизации потоков или процессов?
Взаимная блокировка (deadlock) — ситуация, когда два или более потока или процесса навсегда блокируют друг друга, ожидая освобождения ресурсов, занятых друг другом.
Короткий ответ
Что ответить на собеседовании
Подробный разбор
Ответ с пояснениями
Взаимная блокировка (deadlock) — ситуация, когда два или более потока или процесса навсегда блокируют друг друга, ожидая освобождения ресурсов, занятых друг другом.
Для синхронизации потоков и предотвращения взаимных блокировок в C/C++ часто применяются различные механизмы:
- Использование мьютексов (
std::mutex) с аккуратным порядком захвата ресурсов. - Применение
std::lockилиstd::scoped_lockдля одновременной блокировки нескольких мьютексов без риска взаимной блокировки. - Использование таймаутов при попытке захвата блокировок, чтобы избежать бесконечного ожидания.
Пример с std::scoped_lock, который предотвращает взаимную блокировку при захвате двух мьютексов:
#include <mutex>
std::mutex mtx1, mtx2;
void safeFunction() {
std::scoped_lock lock(mtx1, mtx2); // захватывает оба мьютекса одновременно
// критическая секция
}
Если приходилось работать с потоками, то важно соблюдать порядок захвата ресурсов и использовать современные средства синхронизации, чтобы избежать взаимных блокировок.