Насколько мне известно, никаких шаблонов взаимоблокировок (и 12 лет написания многопоточных торговых приложений). Но класс TimedLock очень помог в поиске взаимоблокировок, которые существуют в коде без масштабной переделки.
http://www.randomtree.org/eric/techblog/archives/2004/10/multithreading_is_hard.html
в основном, (в dotnet / c #) вы ищете / заменяете все ваши операторы «lock (xxx)» на «используя TimedLock.Lock (xxx)»
Если когда-либо обнаруживается взаимоблокировка (блокировка не может быть получена в течение указанного времени ожидания, по умолчанию - 10 секунд), возникает исключение. Моя локальная версия также сразу регистрирует трассировку стека. Пройдите вверх по трассировке стека (желательно отладочную сборку с номерами строк), и вы сразу увидите, какие блокировки удерживались в точке сбоя и какую пытались получить.
В dotnet 1.1, в описанной ситуации взаимоблокировки, если повезет, все заблокированные потоки выдают исключение одновременно. Таким образом, вы получите 2+ стековых трасс и всю информацию, необходимую для решения проблемы. (2.0+ может изменить внутреннюю модель потоков настолько, что это не повезло, я не уверен)