Я экспериментировал с тем, как легко их отследить. Я работал над отслеживанием некоторых тупиков, особенно в тех случаях, когда используется много разных операторов блокировки.
Моя цель - обнаружить тупики до того, как они произойдут, например, если у вас есть два ресурса, вы знаете, что всегда должны использовать их в одном и том же порядке, иначе может возникнуть тупик .
lock (lockObj1)
lock (lockObj2)
{
// some code
}
... где-то еще в приложении ...
lock (lockObj2)
lock (lockObj1) // <- I expect some "possible deadlock" detection here
{
// some code
}
В этом случае я использую lockObj1, а затем lockObj2 в одном месте и использую их в обратном порядке в другом месте, этого вам следует избегать в приложении
Конечно, операторы блокировки не нужно использовать один за другим, как в примере, ваше сложное приложение может иметь несколько сложных объектов, взаимодействующих друг с другом
Я загрузил код с тестовыми примерами здесь
https://github.com/glmnet/LockTracer