寻找一个允许一个写入器而拒绝其他写入器的框架类
本文关键字:拒绝 其他 框架 一个 许一个 寻找 | 更新日期: 2023-09-27 18:07:01
我知道ReaderWriterLock
和ReaderWriterLockSlim
类,我正在寻找类似的东西,我希望已经有一个。net框架类,所以我不需要自己实现。
这是我要找的:
- 一个写入器可以输入"lock"
- 如果"锁"被拥有,可以在队列中多等待一个写器
- 任何更多的写入器返回或获得一个异常,操作当前不可能
在。net框架中存在这样的类吗?
我想要实现的:有一个非常高的速率传入触发器。在每个触发器上,我都想保存状态信息(第1点)。数据不是太重要,所以我真的不关心某些项是否丢失(第3点)。
但是,我希望确保捕获在保存数据时触发的至少一个状态,因为它可能包含重要的更改。这就是要点2。我知道我不能保证能够捕捉到状态的变化,因为它可能被来回更改多次。这是可以接受的。
因为您只需要写入器,所以最简单的解决方案是使用信号量。如果你还需要允许读者,你就有点麻烦了。
基本的方法可能是这样的:
SemaphoreSlim _writerSemaphore = new SemaphoreSlim(2);
readonly object _actionLock = new object();
public bool TryExecute()
{
bool acquired = false;
try
{
acquired = _writerSemaphore.Wait(0);
if (!acquired) return false;
lock (_actionLock)
{
// Your action
}
return true;
}
finally
{
if (acquired) _writerSemaphore.Release();
}
}
如果您还需要阅读器,最简单的解决方案是确保队列在ReaderWriterLock 之前:
SemaphoreSlim _writerSemaphore = new SemaphoreSlim(2);
ReaderWriterLockSlim _readerWriterLock = new ReaderWriterLockSlim();
public bool TryExecuteWriter(Action action)
{
bool acquired = false;
try
{
acquired = _writerSemaphore.Wait(0);
if (!acquired) return false;
_readerWriterLock.EnterWriteLock();
try
{
action();
return true;
}
finally
{
_readerWriterLock.ExitWriteLock();
}
}
finally
{
if (acquired) _writerSemaphore.Release();
}
}
这将确保在任何时候,最多有两个线程等待进入写锁。为了保证正确性,请注意在释放写器锁和释放信号量之间存在一个轻微的竞争条件——然而,考虑到您的约束,这应该不是一个问题。