Конкурентные переводы между счетами без дедлока
Условие
Есть n счетов с начальными балансами. m переводов from to amount выполняют w горутин-воркеров параллельно. Перевод всегда выполняется (уход в минус разрешён), перевод самому себе ничего не меняет. У каждого счёта свой мьютекс, глобальную блокировку использовать нельзя.
Ввод: n m w (1 ≤ n ≤ 1000, 1 ≤ m ≤ 4000, 1 ≤ w ≤ 32), затем n балансов, затем m переводов (номера счетов с 0).
Вывод: итоговые балансы через пробел, затем строка с суммой всех балансов.
Решение должно быть конкурентным (горутины), а вывод не должен зависеть от порядка их выполнения.
Пример
3 4 2
100 50 0
0 1 30
1 2 80
2 0 10
0 2 5
75 0 75
150
Как подойти
Мьютекс на счёт, блокировка в порядке возрастания id, особый случай from == to.
Решите в тренажёре
Редактор с автотестами прямо в браузере. Можно решить спокойно, вслух или под таймером, как на собесе.