Два мьютекса, захватываемые в разном порядке
Перевод средств между счетами:
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>` для полей баланса — тогда блокировки не потребуются и логика останется корректной
