锁定未被释放用于其他线程

时间:2014-12-19 16:14:50

标签: c# multithreading

我有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;
        }
    }

2 个答案:

答案 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;
        }
    }

监视器是重新进行的,因此您可以多次获取它们。但是,您必须记住以相同的号码释放它们,否则它们将保持锁定状态。

相关问题