Логотип YeaHub

База вопросов

Собеседования

Тренажёр

База ресурсов

Обучение

Навыки

Задачи

Войти

Выбери, каким будет IT завтра — вместе c нами!

YeaHub — это полностью открытый проект, призванный объединить и улучшить IT-сферу. Наш исходный код доступен для просмотра на GitHub. Дизайн проекта также открыт для ознакомления в Figma.

© 2026 YeaHub

AI info

Карта сайта

Документы

Медиа

Назад
Вопрос про JavaScript: deadlock, thread, synchronization, mutex, lock

Как создать дедлок между потоками?

Вопрос проверяет понимание механизмов синхронизации потоков и условий возникновения взаимной блокировки (deadlock).

Короткий ответ

Дедлок возникает, когда два или более потоков блокируют друг друга, ожидая освобождения ресурсов, удерживаемых другим потоком. Например, поток A захватывает мьютекс 1 и ждет мьютекс 2, а поток B захватывает мьютекс 2 и ждет мьютекс 1. Ни один из них не может продолжить выполнение, что приводит к зависанию программы.

Длинный ответ

Что такое дедлок?

Дедлок (взаимная блокировка) — это ситуация в многопоточном программировании, когда два или более потоков бесконечно ожидают освобождения ресурсов, захваченных друг другом. Это классическая проблема синхронизации, которая может привести к полной остановке приложения.

Условия возникновения

Для возникновения дедлока необходимо выполнение четырех условий (условия Коффмана):

  • Взаимное исключение — ресурс может быть занят только одним потоком.
  • Удержание и ожидание — поток удерживает один ресурс и ожидает другой.
  • Отсутствие принудительного освобождения — ресурс освобождается только после завершения работы потока.
  • Циклическое ожидание — существует цепочка потоков, каждый из которых ожидает ресурс, удерживаемый следующим.

Пример на C++ с мьютексами

#include <mutex>
#include <thread>

std::mutex mtx1, mtx2;

void threadA() {
    std::lock_guard<std::mutex> lock1(mtx1);
    std::this_thread::sleep_for(std::chrono::milliseconds(100));
    std::lock_guard<std::mutex> lock2(mtx2); // ждет mtx2
}

void threadB() {
    std::lock_guard<std::mutex> lock2(mtx2);
    std::this_thread::sleep_for(std::chrono::milliseconds(100));
    std::lock_guard<std::mutex> lock1(mtx1); // ждет mtx1
}

int main() {
    std::thread t1(threadA);
    std::thread t2(threadB);
    t1.join();
    t2.join();
    return 0;
}

В этом примере threadA захватывает mtx1, а threadB — mtx2. Затем каждый пытается захватить другой мьютекс, что приводит к дедлоку.

Как избежать дедлока?

  • Использовать единый порядок захвата ресурсов (например, всегда захватывать mtx1 перед mtx2).
  • Применять функцию std::lock для атомарного захвата нескольких мьютексов.
  • Использовать таймауты при попытке захвата (например, std::timed_mutex).

Вывод

Дедлок — опасная ситуация, которую необходимо предотвращать на этапе проектирования. Соблюдение порядка блокировок и использование современных средств синхронизации (например, std::lock) помогает избежать взаимных блокировок в многопоточных приложениях.

Уровень

  • Рейтинг:

    4

  • Сложность:

    6

Навыки

  • JavaScript

    JavaScript

  • C

    C

Ключевые слова

#deadlock

#thread

#synchronization

#mutex

#lock

Подпишись на Java Developer в телеграм