首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >简化ReaderWriterLockSlim语法

简化ReaderWriterLockSlim语法
EN

Stack Overflow用户
提问于 2011-07-20 16:08:49
回答 1查看 755关注 0票数 2

我最近不得不使用ReaderWriterLockSlim来同步对多个线程之间共享的多个资源的访问。在这样做的时候,我感觉使用ReaderWriterLockSlim并不容易,特别是当你必须在多个地方使用它的时候。你必须有try...finally块,并且记得打开和关闭锁。在许多情况下,我也发现自己打开了一个写锁并关闭了一个读锁,而不是关闭了写锁。因此,我试着想出一种使用ReaderWriterLockSlim的更简单的方法。这就是我得到的

代码语言:javascript
运行
复制
class Locked<T>
{
    private T _resource;
    private ReaderWriterLockSlim _lock;

    public Locked(T resource)
    {
        _resource = resource;
        _lock = new ReaderWriterLockSlim();
    }

    public void Read(Action<T> ReadAction)
    {
        try
        {
            _lock.EnterReadLock();
            ReadAction(_resource);
        }
        finally
        {
            _lock.ExitReadLock();
        }
    }

    public void Write(Action<T> WriteAction)
    {
        try
        {
            _lock.EnterWriteLock();
            WriteAction(_resource);
        }
        finally
        {
            _lock.ExitWriteLock();
        }
    }
}

现在,例如,如果我们需要同步对List<string>的访问,这就是我们使用上面的类实现的方法

代码语言:javascript
运行
复制
public class Demo
{
    private Locked<List<string>> _listOfString;

    public Demo()
    {
        _listOfString = new Locked<List<string>>(new List<string>());
    }

    public void writeMethod(string value)
    {
        _listOfString.Write(list =>
        {
            list.Add(value);
        });
    }

    public string readMethod(int index)
    {
        string value = null;
        _listOfString.Read(list =>
        {
            value = list[index];
        });
        return value;
    }
}

你认为这种方法会更好吗?是否有任何缺点或缺陷。

EN

回答 1

Stack Overflow用户

发布于 2011-07-20 16:18:22

我宁愿将锁定逻辑包装在IDisposable中,并将您想要锁定的代码放在using块中,这与lock语句非常相似:

代码语言:javascript
运行
复制
class DisposableLock : IDisposable
{
    Action _exitLock;
    public DisposableLock(Action exitLock)
    {
        _exitLock = exitLock;
    }

    public void Dispose()
    {
        _exitLock();
    }
}

class ReadLock : DisposableLock
{
    public ReadLock(ReaderWriterLockSlim slimLock)
        : base(() => slimLock.ExitReadLock())
    {
        slimLock.EnterReadLock();
    }
}

class WriteLock : DisposableLock
{
    public WriteLock(ReaderWriterLockSlim slimLock)
        : base(() => slimLock.ExitWriteLock())
    {
        slimLock.EnterWriteLock();
    }
}

您可以这样使用它:

代码语言:javascript
运行
复制
using(new ReadLock(_lock))
{
    // ... your synchronized operation
}

using(new WriteLock(_lock))
{
    // ... your synchronized operation
}
票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/6758858

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档