首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >ReaderWriterLockSlim.EnterUpgradeableReadLock()总是死锁吗?

ReaderWriterLockSlim.EnterUpgradeableReadLock()总是死锁吗?
EN

Stack Overflow用户
提问于 2014-01-28 16:17:56
回答 2查看 7.6K关注 0票数 9

我对ReaderWriterLockSlim非常熟悉,但最近我尝试在一个类中实现EnterUpgradeableReadLock() .当我意识到当两个或更多线程运行代码时,这几乎肯定是一个有保证的死锁:

代码语言:javascript
复制
Thread A --> enter upgradeable read lock
Thread B --> enter upgradeable read lock
Thread A --> tries to enter write lock, blocks for B to leave read
Thread B --> tries to enter write lock, blocks for A to leave read
Thread A --> waiting for B to exit read lock
Thread B --> waiting for A to exit read lock

我在这里错过了什么?

编辑

添加了我的场景的代码示例。Run()方法将由2个或多个线程并发调用。

代码语言:javascript
复制
public class Deadlocker
{
    private readonly ReaderWriterLockSlim _lock = new ReaderWriterLockSlim(LockRecursionPolicy.SupportsRecursion);

    public void Run()
    {
        _lock.EnterUpgradeableReadLock();
        try
        {
            _lock.EnterWriteLock();
            try
            {
                // Do something
            }
            finally
            {
                _lock.ExitWriteLock();
            }
        }
        finally
        {
            _lock.ExitUpgradeableReadLock();
        }
    }
}
EN

回答 2

Stack Overflow用户

发布于 2014-01-28 16:26:56

我建议避免使用EnterUpgradeableReadLock()。只需使用EnterWriteLock()即可。我知道这似乎是低效的,可升级的读锁几乎和写锁一样糟糕。

票数 1
EN

Stack Overflow用户

发布于 2017-04-25 04:21:52

您的示例中有一个错误

代码语言:javascript
复制
private readonly ReaderWriterLockSlim _lock = new ReaderWriterLockSlim(LockRecursionPolicy.SupportsRecursion);

它应该是

代码语言:javascript
复制
private static readonly ReaderWriterLockSlim _lock = new  ReaderWriterLockSlim(LockRecursionPolicy.SupportsRecursion);

现在,在您的代码中,每当一个类被实例化时,它都在创建ReaderWriterLockSlim的新实例,它无法锁定任何东西,因为每个线程都有它自己的实例。使其静态将强制所有线程使用一个实例,该实例将按其应有的方式工作。

票数 -1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/21411018

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档