尝试读取资源时 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 阻塞的主要内容,如果未能解决你的问题,请参考以下文章
写出java多线程程序设计中常用类及方法名,并分别说明它们的作用。
上传程序Dictionary 字典 哈希--多读一写锁ReaderWriterLock
C#各种同步方法 lock, Monitor,Mutex, Semaphore, Interlocked, ReaderWriterLock,AutoResetEvent, ManualResetEv