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

实现一个c#读写锁,其中一些读操作会产生写操作,c#,.net,readwritelock,C#,.net,Readwritelock,我必须实现一些.Net代码,这些代码涉及由不同线程访问的共享资源。原则上,这应该通过一个简单的读写锁来解决。然而,我的解决方案要求某些读访问最终产生写操作。我首先检查了ReaderWriterLockSlim,但它本身并不能解决问题,因为它要求我提前知道读操作是否可以转变为写操作,而我的情况并非如此。最后,我选择了简单地使用ReaderWriterLockSlim,当读操作“检测到”需要执行写操作时,释放读锁并获取写锁。我不确定是否有更好的解决方案,或者这个解决方案是否会导致一些同步问题(我有J

我必须实现一些.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();
        }
    }

}
公共类MyClass
{
私有int[]数据;
私有只读ReaderWriterLockSlim syncLock=新的ReaderWriterLockSlim();
公共void modifyData()
{
尝试
{
syncLock.EnterWriteLock();
//清除我的数组并从数据库中读取。。。
}
最后
{
syncLock.ExitWriteLock();
}
}
公共整型读取数据(整型索引)
{
尝试
{
syncLock.EnterReadLock();
//参数的一些初始预处理
尝试
{
_syncLock.exitradlock();
_syncLock.EnterWriteLock();

//检查是否需要写入为什么不能只使用两个普通对象(一个用于读取,一个用于写入)和“锁定”语句?这是否是一个好的解决方案取决于您在
readData
中执行的操作的性质。我想您已经意识到,读写器都可以在
exitradlock
EnterWriteLock
之间拦截您。如果您对此没有问题,那么就可以了。ReaderWriter锁类有:方法UpgradeToWriterLock()--这适用于像您这样的场景。@Matas使用两个单独的锁不是解决方案,因为这会导致写入与读取同时执行。@Prateek the UpgradeToWriterLock()这种方法涉及到一次只能访问一个线程,失去了同时读取的优势。在我理解的范围内,以可升级模式进入只能访问一个线程。