C# 未为其他线程释放锁
我有5个线程试图在随机时间进入静态类的关键部分。如果另一个线程在关键部分,我希望其他线程“后退”,稍后再试。问题是,在第一个线程进入临界段后,锁似乎没有被释放,因为对于其他线程,如果我在Monitor.TryEnterthisLock上设置“断点”,则将始终返回false。 任何帮助都将不胜感激。谢谢 这是我的代码:C# 未为其他线程释放锁,c#,multithreading,C#,Multithreading,我有5个线程试图在随机时间进入静态类的关键部分。如果另一个线程在关键部分,我希望其他线程“后退”,稍后再试。问题是,在第一个线程进入临界段后,锁似乎没有被释放,因为对于其他线程,如果我在Monitor.TryEnterthisLock上设置“断点”,则将始终返回false。 任何帮助都将不胜感激。谢谢 这是我的代码: static class Receiver { public static object thisLock = new object();
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是合法的;但是,在等待对象的其他线程解除阻止之前,必须调用相同数量的退出调用
基本上,您在代码中获得了两次锁。您需要删除对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;
}
}
同一线程在没有阻塞的情况下多次调用Enter是合法的;但是,在等待对象的其他线程解除阻止之前,必须调用相同数量的退出调用
基本上,您在代码中获得了两次锁。您需要删除对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;
}
}
监视器是可重新连接的,因此您可以多次获取它们。但是,您必须记住按相同的数字释放它们,否则它们将保持锁定。您将获得两次锁,但只释放一次 如果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;
}
}
监视器是可重新连接的,因此您可以多次获取它们。但是,您必须记住按相同的数字释放它们,否则它们将保持锁定状态。您将获取两次锁Monitor.TryEnterthisLock,然后再次Monitor.EnterthisLock,但仅释放一次。感谢您的帮助。您将获取两次锁Monitor.TryEnterthisLock,然后再次Monitor.EnterthisLock,但只发布一次。谢谢你的帮助。非常感谢你的帮助,这是我这边的疏忽。非常感谢你的帮助,这是我这边的疏忽。