未被持有的写锁被释放
本文关键字:写锁 释放 | 更新日期: 2023-09-27 18:10:56
我有一个情况,即ReadWriterLockSlim抛出异常"System.Threading. error "。当我尝试执行ExitWriteLock()时,写锁正在被释放而没有被持有。据我所知,这不应该发生,因为进入try块的后续线程将"阻塞",直到它们能够获得锁。我遗漏了什么吗?
这个问题看起来非常类似于这个,但是没有解决方案被张贴在那里。
//Code simplified for example.
public class i18nService {
internal static ReaderWriterLockSlim cacheLock = new ReaderWriterLockSlim(LockRecursionPolicy.NoRecursion);
private string ProcessText()
{
try {
cacheLock.EnterWriteLock();
return "xyz";
}
finally {
cacheLock.ExitWriteLock(); // Error is throwing here.
}
}
}
非常感谢您的帮助:-)
但是如果在试图进入锁时抛出错误,那么它将最终执行,而不保留它。为什么不直接改成:
...
finally {
if(cacheLock.IsWriteLockHeld)
cacheLock.ExitWriteLock();
}
...
try {
cacheLock.EnterWriteLock();
return "xyz";
}
finally {
cacheLock.ExitWriteLock(); // Error is throwing here.
}
问:如果cacheLock.EnterWriteLock();
失效怎么办?
A:执行finally
语句。
-
cacheLock.ExitWriteLock();
被调用 但是我们没有锁
试试这个:
private string ProcessText()
{
cacheLock.EnterWriteLock();
try {
return "xyz";
}
finally {
cacheLock.ExitWriteLock(); // Error is throwing here.
}
}
假定。net是这样设计的:如果EnterWriteLock()
失败,锁将被释放(或者根本不持有)。