【发布时间】:2012-04-24 17:45:18
【问题描述】:
我遇到了这个异常
读锁被释放而不被持有。
在 System.Threading.ReaderWriterLockSlim.ExitReadLock()
在..GetBreed(String)
下面是代码中唯一可以访问锁的地方。如您所见,没有递归。我无法理解这个异常是如何发生的。
static readonly Dictionary<string, BreedOfDog> Breeds
= new Dictionary<string,BreedOfDog>();
static BreedOfDog GetBreed(string name)
{
try
{
rwLock.EnterReadLock();
BreedOfDog bd;
if (Breeds.TryGetValue(name, out bd))
{
return bd;
}
}
finally
{
rwLock.ExitReadLock();
}
try
{
rwLock.EnterWriteLock();
BreedOfDog bd;
//make sure it hasn't been added in the interim
if (Breeds.TryGetValue(t, out bd)
{
return bd;
}
bd = new BreedOfDog(name); //expensive to fetch all the data needed to run the constructor, hence the caching
Breeds[name] = bd;
return bd;
}
finally
{
rwLock.ExitWriteLock();
}
}
【问题讨论】:
-
你能制作一个简短但完整的程序来演示这个问题吗?
-
GetBreed 从不同的线程运行?
-
你不应该获取锁,放手,然后获取它。您应该从头到尾保持锁定并使用可升级的读锁,然后如果需要写入则升级。
-
@vcsjones 我不同意 - 在大多数情况下,释放并重新获取(也许仔细检查)更有效
-
@spender 是的,它从不同的线程运行
标签: c# multithreading readerwriterlockslim