实现一个c#读写锁,其中一些读操作产生写

时间:2018-04-16 09:05:37

标签: c# .net readwritelock

我必须实现一些涉及不同线程访问的共享资源的.Net代码。原则上,这应该通过简单的读写锁来解决。但是,我的解决方案要求某些读取访问最终会产生写入操作。我首先检查了ReaderWriterLockSlim,但它本身并没有解决问题,因为它要求我事先知道读操作是否可以变成写操作,而这不是我的情况。我最后选择只使用ReaderWriterLockSlim,当读取操作“检测到”需要执行写操作时,释放读锁并获取写锁。我不确定是否有更好的解决方案或事件,如果此解决方案可能导致某些同步问题(我有Java经验,但我对.Net相当新。)

下面是一些说明我的解决方案的示例代码:

public class MyClass
{
    private int[] data;

    private readonly ReaderWriterLockSlim syncLock = new ReaderWriterLockSlim();

    public void modifyData()
    {
        try
        {
            syncLock.EnterWriteLock();

            // clear my array and read from database...
        }
        finally
        {
            syncLock.ExitWriteLock();
        }
    }

    public int readData(int index)
    {
        try
        {
            syncLock.EnterReadLock();
            // some initial preprocessing of the arguments

            try
            {
                _syncLock.ExitReadLock();
                _syncLock.EnterWriteLock();

                // check if a write is needed <--- this operation is fast, and, in most cases, the result will be false
                // if true, perform the write operation
            }
            finally
            {
                _syncLock.ExitWriteLock();
                _syncLock.EnterReadLock();
            }

            return data[index];
        }
        finally
        {
            syncLock.ExitReadLock();
        }
    }

}

0 个答案:

没有答案