【发布时间】:2012-12-30 09:22:04
【问题描述】:
是否可以检测是否是同一个线程试图释放锁? 我们在代码中有很多地方看起来像:
try
{
try
{
if(!Monitor.TryEnter(obj, 2000))
{
throw new Exception("can not lock");
}
}
finally
{
Monitor.Exit(obj);
}
}
catch
{
//Log
}
上面的代码非常简化,实际上Enter和Exit语句位于自定义对象(锁管理器)中。
问题是,在那个结构中,我们在尝试“退出”时有SynchronizationLockException,因为它看起来像没有成功锁定的线程,最终试图释放。
所以问题是,我如何知道制作 Monitor.Exit 的线程是否与执行 Monitor.Enter 的线程相同?
我认为我可以使用 CurrentThread.Id 来同步进入和退出,但我不确定它是否足够“安全”。
【问题讨论】:
-
既然您声明实际的 Enter 和 Exit 语句位于自定义对象中,我想知道您是否可以访问外部块中的
obj? -
不,在外部块中我没有对对象的引用,因为锁管理器接收“key”作为参数并创建它自己的锁对象。您可以在我之前的问题中看到我的锁管理器:stackoverflow.com/questions/14030491/…
标签: c# .net multithreading locking