Исключение внутри критической секции
std::mutex m;
void update(const Item& it) {
m.lock();
cache.insert(it); // может бросить std::bad_alloc
m.unlock();
}
После редкого исключения в insert сервис перестаёт отвечать: все потоки висят. Почему и что исправить?
- `unlock` не выполняется при раскрутке стека, мьютекс остаётся захваченным навсегда
- Исключение внутри критической секции переводит мьютекс в неопределённое состояние, поэтому после каждой ошибки его нужно пересоздавать заново
- Проблема во владельце: мьютекс должен разблокировать тот же поток, поэтому нужен `std::recursive_mutex`
- Вставка в кэш под мьютексом недопустима: аллокация памяти сама по себе приводит к взаимной блокировке
