title: implementing a c# read write lock where some reads produce writes
body: <p>I have to implement some .Net code involving a shared resource accessed by different threads. In principle, this should be solved with a simple read write lock. However, my solution requires that some of the read accessions do end up producing a write operation. I first checked the ReaderWriterLockSlim, but by itself it does not solve the problem, because it requires that I know in advance if a read operation can turn into a write operation, and this is not my case. I finally opted by simply using a ReaderWriterLockSlim, and when the read operation "detects" that needs to do a write operation, release the read lock and acquire a write lock. I am not sure if there is a better solution, or event if this solution could lead to some synchronization issue (I have experience with Java, but I am fairly new to .Net).</p>
  
  <p>Below some sample code illustrating my solution:</p>
  
  <pre><code>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 &lt;--- 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();
          }
      }
  
  }
  </code></pre>