尝试读取资源时 ReaderWriterLock 阻塞

Posted

技术标签:

【中文标题】尝试读取资源时 ReaderWriterLock 阻塞【英文标题】:ReaderWriterLock blocks when trying to read resource 【发布时间】:2019-05-06 14:16:19 【问题描述】:

我正在尝试将ReaderWriterLock 用于两个Tasks 之间的共享资源。由于某种原因,它开始无限期地等待:

class State 

        private const int TIMEOUT = 5000;
        private ReaderWriterLock lck = new ReaderWriterLock();
        private TimeSpan lastIssuedAt;

        public TimeSpan LastIssuedAt 
            get 

                this.lck.AcquireReaderLock(TIMEOUT);
                return this.lastIssuedAt;
            
            set 
                this.lck.AcquireWriterLock(TIMEOUT);
                this.lastIssuedAt = value;
            
        

当一个任务尝试get 属性LastIssuedAt 它只是阻塞,我不明白为什么。

【问题讨论】:

你也必须释放锁。 我认为当方法退出时它会被释放。我还需要释放Readerlock 吗?还有get 我在哪里释放它?在return 之前? get 是否需要一个额外的变量? get lock.AcquireReader(); var value=... ; lock.ReleaseReader(); return val ; 【参考方案1】:

看看MSDN上的例子:https://docs.microsoft.com/en-us/dotnet/api/system.threading.readerwriterlock?view=netframework-4.8

您忘记释放锁。这样做的常见模式是 try/finally:

ReaderWriterLock lck = new ReaderWriterLock();

lck.AcquireReaderLock(timeOut);
try

    // Do what needs to be done under the lock

finally 

    // Ensure that the lock is released.
    lck.ReleaseReaderLock();

另外,请查看 ReaderWriterLockSlim:https://docs.microsoft.com/en-us/dotnet/api/system.threading.readerwriterlockslim?view=netframework-4.8 哪个 MSDN 推荐用于新开发。

【讨论】:

但在我的情况下,我需要释放 getter 中的锁。 这就是“终于”的魔力。 docs.microsoft.com/en-us/dotnet/csharp/language-reference/… finally 块中的任何内容都会在您离开 'try' 块时运行。因此,即使您退出“尝试”,您的锁定也会被释放。 我不想在getter 中使用try-catch 你不需要捕获。试一试/终于

以上是关于尝试读取资源时 ReaderWriterLock 阻塞的主要内容,如果未能解决你的问题,请参考以下文章

C# 多线程并发锁模式-总结

写出java多线程程序设计中常用类及方法名,并分别说明它们的作用。

上传程序Dictionary 字典 哈希--多读一写锁ReaderWriterLock

C#各种同步方法 lock, Monitor,Mutex, Semaphore, Interlocked, ReaderWriterLock,AutoResetEvent, ManualResetEv

尝试共享应用程序时 iPhone 代码设计错误(ResourceRules.plist:无法读取资源)

如何在Java中读取内容时指定资源中文件的路径