未被持有的写锁被释放

本文关键字:写锁 释放 | 更新日期: 2023-09-27 18:10:56

我有一个情况,即ReadWriterLockSlim抛出异常"System.Threading. error "。当我尝试执行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();失效怎么办?

A:执行finally语句。

  • cacheLock.ExitWriteLock();被调用
  • 但是我们没有锁

试试这个:

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

假定。net是这样设计的:如果EnterWriteLock()失败,锁将被释放(或者根本不持有)。