【问题标题】:ReaderWriterLock blocks when trying to read resource尝试读取资源时 ReaderWriterLock 阻塞
【发布时间】: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 ; }

标签: .net-core task-parallel-library readerwriterlock


【解决方案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
  • 你不需要捕获。试一试/终于
猜你喜欢
  • 2015-09-29
  • 1970-01-01
  • 2012-09-04
  • 1970-01-01
  • 2011-03-13
  • 2014-02-03
  • 1970-01-01
  • 1970-01-01
  • 2019-02-09
相关资源
最近更新 更多