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

Два мьютекса, захватываемые в разном порядке

Перевод средств между счетами:

void transfer(Account& from, Account& to, int sum) {
    std::lock_guard<std::mutex> l1(from.m);
    std::lock_guard<std::mutex> l2(to.m);
    from.balance -= sum;
    to.balance += sum;
}

Под нагрузкой два потока намертво зависают. Что произошло и как чинить?

  • `lock_guard` освобождает мьютексы в порядке захвата, из-за чего второй остаётся заблокированным после выхода из функции; нужен `unique_lock` с явным `unlock`
  • Не хватает `std::recursive_mutex`: один поток дважды входит в критическую секцию одного счёта
  • Взаимная блокировка при встречных переводах A→B и B→A; спасёт `std::scoped_lock l(from.m, to.m)` или единый порядок захвата
  • Мьютексы нужно заменить на `std::atomic<int>` для полей баланса — тогда блокировки не потребуются и логика останется корректной

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

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

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

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