【问题标题】:Lock not being released for other threads没有为其他线程释放锁
【发布时间】:2014-12-19 16:14:50
【问题描述】:

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

【问题讨论】:

  • 您获得了两次锁Monitor.TryEnter(thisLock),然后又获得了一次Monitor.Enter(thisLock),但只释放了一次。
  • 感谢您的帮助。

标签: c# multithreading


【解决方案1】:

同一个线程在不阻塞的情况下多次调用 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;
    }
}

【讨论】:

  • 非常感谢您的帮助,这是我的疏忽。
【解决方案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;
        }
    }

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-10-30
    • 1970-01-01
    • 2018-10-19
    • 2018-11-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多