Сегодня я столкнулся с этим: https://blogs.msdn.microsoft.com/ericlippert/2009/03/06/locks-and-exceptions-do-not-mix/.net 2.0 блокировка и исключения перед попыткой-наконец. Есть ли другие исключения, кроме прерывания потока?
Я использую .net 2.0, так что, в принципе, этот код
lock(syncRootVar) {
DoStuff();
}
будет разворачиваться в этом
Monitor.Enter(syncRootVar);
try {
DoStuff();
} finally {
Monitor.Exit(syncRootVar);
}
Как писал Lippert в блоге может быть операция nop между вызовом Enter и блоком try-finally, являющимся потенциальной позицией для исключения прерывания потока, которое должно быть поднято, и, следовательно, испортить блокировку.
У меня есть два вопроса по этому поводу:
- Есть ли общий способ обработки этой нежелательной ситуации, и до сих пор очистить объект блокировки для того, чтобы не влиять на другие темы?
- Существуют ли другие ситуации, которые могут привести к приобретению блокировки, но исключения, возникающие перед блоком try-finally?