【发布时间】:2016-01-15 01:35:45
【问题描述】:
今天我遇到了这个: https://blogs.msdn.microsoft.com/ericlippert/2009/03/06/locks-and-exceptions-do-not-mix/
我使用的是 .net 2.0,所以基本上就是这段代码
lock(syncRootVar) {
DoStuff();
}
将展开到这里
Monitor.Enter(syncRootVar);
try {
DoStuff();
} finally {
Monitor.Exit(syncRootVar);
}
正如 Lippert 在博客上所写,在 Enter 调用和 try-finally 块之间可能存在一个 nop 操作,这可能是引发线程中止异常并因此搞砸锁的潜在位置。
我对此有两个问题:
- 有没有一种通用的方法来处理这种麻烦的情况并且仍然清理锁对象以免影响其他线程?
- 是否存在其他可能导致获取锁但在 try-finally 块之前引发异常的情况?
【问题讨论】:
标签: c# multithreading locking .net-2.0