[英]Lock not being released for other threads
我有5个线程尝试随机进入静态类的关键部分。 如果关键部分有其他线程,我希望其他线程“退缩”并稍后再试。 问题在于,在第一个线程进入关键部分后,似乎没有释放该锁,因为对于其他线程,如果我在Monitor.TryEnter(thisLock)
处出现“断点”,则总是会返回false。 任何帮助,将不胜感激。 谢谢。
这是我的代码:
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;
}
}
同一线程多次调用Enter而不阻塞它是合法的; 但是,必须先调用相等数量的Exit调用,然后其他等待该对象的线程才能解除阻塞。
http://msdn.microsoft.com/zh-cn/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;
}
}
您获得了两次锁,但是只释放了一次。
如果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;
}
}
监视器是可重入的,因此您可以多次获取它们。 但是,您必须记住以相同的数字释放它们,否则它们将保持锁定状态。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.