c# - 可以锁定所有键的 AsyncDuplicateLock

标签 c# .net asynchronous async-await locking

我需要一把类似于 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/

相关文章:

c# - 在c#中从mysql数据库检索单词分数

c# - 在 C# 中创建新对象时,{ } 的行为是否类似于 ( )?

c# - 将 C# 字符串传递给 javascript 时如何优雅地转义单引号和双引号

c# - 在将图像添加到 PDF 之前如何旋转图像?

c# - 无法启动 Windows 服务,错误 1064

multithreading - 如何在nodejs中创建线程

c# - 我如何在 mvc 中启动任务并在任务完成时收到通知?

javascript - 如何从 Express 中间件作为单独的模块返回值

c# - 在字符 != "_"时获取最后一个字符

.net - Cosmos DB 模拟器 : Failed to get authorization headers for offers