C# 未为其他线程释放锁

C# 未为其他线程释放锁,c#,multithreading,C#,Multithreading,我有5个线程试图在随机时间进入静态类的关键部分。如果另一个线程在关键部分,我希望其他线程“后退”,稍后再试。问题是,在第一个线程进入临界段后,锁似乎没有被释放,因为对于其他线程,如果我在Monitor.TryEnterthisLock上设置“断点”,则将始终返回false。 任何帮助都将不胜感激。谢谢 这是我的代码: static class Receiver { public static object thisLock = new object();

我有5个线程试图在随机时间进入静态类的关键部分。如果另一个线程在关键部分,我希望其他线程“后退”,稍后再试。问题是,在第一个线程进入临界段后,锁似乎没有被释放,因为对于其他线程,如果我在Monitor.TryEnterthisLock上设置“断点”,则将始终返回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是合法的;但是,在等待对象的其他线程解除阻止之前,必须调用相同数量的退出调用

基本上,您在代码中获得了两次锁。您需要删除对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,但只发布一次。谢谢你的帮助。非常感谢你的帮助,这是我这边的疏忽。非常感谢你的帮助,这是我这边的疏忽。