我有5个线程试图在随机时间输入静态类的关键部分。如果另一个线程在关键部分,我希望其他线程退回'并在以后尝试。问题是在第一个线程进入临界区后似乎没有释放锁,因为对于其他人,如果我的断点'断点将永远返回false。在Monitor.TryEnter(thisLock)
。
任何帮助,将不胜感激。感谢。
这是我的代码:
static class Receiver
{
public static object thisLock = new object();
public static int success;
public static bool hasLocked()
{
if(Monitor.TryEnter(thisLock))
{
Monitor.Enter(thisLock);
System.Threading.Thread.Sleep(10);
success++;
Monitor.Exit(thisLock);
return true;
}
return false;
}
}
答案 0 :(得分:3)
同一个线程在没有阻塞的情况下多次调用Enter是合法的;但是,在等待对象的其他线程将解除阻塞之前,必须调用相同数量的Exit调用。
http://msdn.microsoft.com/en-us/library/de0542zz%28v=vs.110%29.aspx
基本上,您在代码中两次获取锁定。由于Monitor.Enter
已获得锁定,您需要移除对Monitor.TryEnter
的调用。
static class Receiver
{
public static object thisLock = new object();
public static int success;
public static bool hasLocked()
{
if(Monitor.TryEnter(thisLock))
{
System.Threading.Thread.Sleep(10);
success++;
Monitor.Exit(thisLock);
return true;
}
return false;
}
}
答案 1 :(得分:2)
您已经两次获取锁定,但只释放一次。
如果TryEnter
成功,那么您将获得锁定。这意味着您不需要再次明确获取它。但是,您确实需要明确释放它。所以你的代码应该是这样的:
static class Receiver
{
public static object thisLock = new object();
public static int success;
public static bool hasLocked()
{
if(Monitor.TryEnter(thisLock))
{
System.Threading.Thread.Sleep(10);
success++;
Monitor.Exit(thisLock);
return true;
}
return false;
}
}
监视器是重新进行的,因此您可以多次获取它们。但是,您必须记住以相同的号码释放它们,否则它们将保持锁定状态。