Вступить в клуб →
лёгкаявопросМногопоточность и синхронизация

Исключение внутри критической секции

std::mutex m;

void update(const Item& it) {
    m.lock();
    cache.insert(it);      // может бросить std::bad_alloc
    m.unlock();
}

После редкого исключения в insert сервис перестаёт отвечать: все потоки висят. Почему и что исправить?

  • `unlock` не выполняется при раскрутке стека, мьютекс остаётся захваченным навсегда
  • Исключение внутри критической секции переводит мьютекс в неопределённое состояние, поэтому после каждой ошибки его нужно пересоздавать заново
  • Проблема во владельце: мьютекс должен разблокировать тот же поток, поэтому нужен `std::recursive_mutex`
  • Вставка в кэш под мьютексом недопустима: аллокация памяти сама по себе приводит к взаимной блокировке

🔒 Проверка ответа — для участников клуба

  • Проверка ответа
  • Подсказка, если застряли
  • Разбор с объяснением, почему так
  • Прогресс по всем задачам и виртуальные собеседования
Зарегистрироваться →

Регистрация занимает минуту

Другие задачи раздела