作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我需要一把类似于 Stephen Cleary 的回答中的锁:https://stackoverflow.com/a/31194647/4381408
但是,我还需要能够同时锁定所有键。我正在使用 Stephen Cleary's AsyncEx library同样,所以我想像这样将 AsyncDuplicateLock 与 AsyncReaderWriterLock 结合起来:
public sealed class AsyncDuplicateReaderWriterLock
{
private AsyncReaderWriterLock _rwLock = new AsyncReaderWriterLock();
private AsyncDuplicateLock _duplicateLock = new AsyncDuplicateLock();
public IDisposable ReaderLock(object key)
{
return CollectionDisposable.Create(
_rwLock.ReaderLock(),
_duplicateLock.Lock(key)
);
}
public async Task<IDisposable> ReaderLockAsync(object key)
{
return CollectionDisposable.Create(
await _rwLock.ReaderLockAsync(),
await _duplicateLock.LockAsync(key));
}
public IDisposable WriterLock()
{
return _rwLock.WriterLock();
}
public async Task<IDisposable> WriterLockAsync()
{
return await _rwLock.WriterLockAsync();
}
}
这样,我可以使用 ReaderLock 锁定一个键,并使用 WriterLock 锁定所有键。做对这一点很重要,所以我想确保没有办法让它死锁或锁定不正确。我对此没有足够的信心。
那么这项工作是否有效,并且是线程安全的?
感谢您的帮助!
最佳答案
我强烈,强烈建议您退后一步,想想您要解决的实际问题,向其他人解释,并询问他们如何解决并发问题.
就是说,是的,您可以(ab)使用读取器/写入器锁来执行此操作。就个人而言,我会分开锁定:
public IDisposable ReaderLock(object key)
{
var rwKey = _rwLock.ReaderLock();
var duplicateKey = _duplicateLock.Lock(key);
return CollectionDisposable.Create(rwKey, duplicateKey);
}
// (and the same for async)
这使得代码首先采用 RWL 变得更加明显(为了正确,它必须这样做)。
关于c# - 可以锁定所有键的 AsyncDuplicateLock,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55283882/
我需要一把类似于 Stephen Cleary 的回答中的锁:https://stackoverflow.com/a/31194647/4381408 但是,我还需要能够同时锁定所有键。我正在使用 S
我是一名优秀的程序员,十分优秀!