Как правило, вы не блокируете потоки - вы блокируете структуры данных, когда любые / все потоки, которые хотят получить доступ к этой структуре данных, должны получить мьютекс структуры данных.
В вашем случае это означает один мьютекс на банковский счет.
Следующая проблема заключается в том, что некоторые вещи должны иметь доступ к нескольким структурам данных. Примером этого может быть перевод $ 100 с одного счета на другой (где вы хотите заблокировать обе учетные записи, затем уменьшить баланс первой учетной записи и увеличить баланс второй учетной записи, а затем снять обе блокировки). Это может привести к тупикам. Например, если один поток хочет заблокировать A, то B, а другой поток хочет заблокировать B, тогда A; тогда первый поток может заблокировать A, а второй поток может заблокировать B, и тогда ни один из потоков не сможет получить вторую нужную блокировку.
Решение этой проблемы состоит в том, чтобы иметь глобальный «порядок блокировки» и получать блокировки только в этом порядке.
Для вашего случая у вас есть номера счетов. Если поток хочет заблокировать 2 или более учетных записей, он определяет, какие учетные записи, затем сортирует список учетных записей (например, с наименьшего номера счета на наибольший номер счета), а затем получает все блокировки, которые ему необходимы в этом порядке. Как только поток получает все необходимые ему блокировки, он делает все, что должен, затем освобождает все полученные блокировки в обратном порядке.