繁体   English   中英

写锁定被释放而不被保持

[英]Write lock being released without being held

我有一种情况,ReadWriterLockSlim抛出异常“System.Threading.SynchronizationLockException - 写锁定被释放而不被保留。” 当我尝试执行ExitWriteLock()时。 据我所知,这不应该发生,因为进入try块的后续线程将“阻塞”直到他们可以获得锁定。 我在这里错过了什么吗?

该问题与问题非常相似,但没有找到解决方案。

//Code simplified for example. 

public class i18nService {
    internal static ReaderWriterLockSlim cacheLock = new ReaderWriterLockSlim(LockRecursionPolicy.NoRecursion);

    private string ProcessText()
    {
        try {
            cacheLock.EnterWriteLock();
            return "xyz";
        }
        finally {
            cacheLock.ExitWriteLock(); // Error is throwing here. 
        }
    }
}

非常感谢您的帮助 :-)

但是如果在尝试输入锁定时抛出错误,那么它将最终执行,而不会保留它。 为什么不简单地变为:

...
finally {
    if(cacheLock.IsWriteLockHeld)
        cacheLock.ExitWriteLock();
}
...
    try {
        cacheLock.EnterWriteLock();
        return "xyz";
    }
    finally {
        cacheLock.ExitWriteLock(); // Error is throwing here. 
    }

问:如果cacheLock.EnterWriteLock();会发生什么? 失败?

答: finally语句被执行。

  • cacheLock.ExitWriteLock(); 被叫
  • 但我们没有锁

试试这个:

private string ProcessText()
{
    cacheLock.EnterWriteLock();
    try {
        return "xyz";
    }
    finally {
        cacheLock.ExitWriteLock(); // Error is throwing here. 
    }
}

据推测,.NET的设计方式是,如果EnterWriteLock()失败,则锁定被释放(或根本不被保留)。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM