Csharp/C Sharp by API/System.Threading/ReaderWriterLock

Материал из .Net Framework эксперт
Перейти к: навигация, поиск

ReaderWriterLock.AcquireWriterLock

<source lang="csharp"> using System; using System.Collections.Generic; using System.Diagnostics; using System.IO; using System.Reflection; using System.Runtime; using System.Runtime.rupilerServices; using System.Security; using System.Text; using System.Threading; public class MainClass {

   public static void Main()
   {
      ReaderWriterLock rwLock = new ReaderWriterLock();
       rwLock.AcquireWriterLock(250);
       if (rwLock.IsWriterLockHeld)
       {
           Console.WriteLine("Writer lock held");
           rwLock.ReleaseWriterLock();
       }
       rwLock.ReleaseWriterLock();
   }

}


 </source>


ReaderWriterLock.DowngradeFromWriterLock

<source lang="csharp"> using System; using System.Collections.Generic; using System.Diagnostics; using System.IO; using System.Reflection; using System.Runtime; using System.Runtime.rupilerServices; using System.Security; using System.Text; using System.Threading; public class MainClass {

   public static void Main()
   {
      ReaderWriterLock rwLock = new ReaderWriterLock();
       rwLock.AcquireReaderLock(250);
       if (!rwLock.IsReaderLockHeld)
          return;
       Console.WriteLine("Reader lock held");
       
       LockCookie cookie = rwLock.UpgradeToWriterLock(250);
       if (rwLock.IsWriterLockHeld)
       {
           Console.WriteLine("Upgraded to writer lock");
           rwLock.DowngradeFromWriterLock(ref cookie);
       }
       rwLock.ReleaseReaderLock();
   }

}


 </source>


ReaderWriterLock.IsReaderLockHeld

<source lang="csharp"> using System; using System.Collections.Generic; using System.Diagnostics; using System.IO; using System.Reflection; using System.Runtime; using System.Runtime.rupilerServices; using System.Security; using System.Text; using System.Threading; public class MainClass {

   public static void Main()
   {
      ReaderWriterLock rwLock = new ReaderWriterLock();
       rwLock.AcquireReaderLock(250);
       if (!rwLock.IsReaderLockHeld)
          return;
       Console.WriteLine("Reader lock held");
       
       LockCookie cookie = rwLock.UpgradeToWriterLock(250);
       if (rwLock.IsWriterLockHeld)
       {
           Console.WriteLine("Upgraded to writer lock");
           rwLock.DowngradeFromWriterLock(ref cookie);
       }
       rwLock.ReleaseReaderLock();
   }

}


 </source>


ReaderWriterLock.IsWriterLockHeld

<source lang="csharp"> using System; using System.Collections.Generic; using System.Diagnostics; using System.IO; using System.Reflection; using System.Runtime; using System.Runtime.rupilerServices; using System.Security; using System.Text; using System.Threading; public class MainClass {

   public static void Main()
   {
      ReaderWriterLock rwLock = new ReaderWriterLock();
       rwLock.AcquireReaderLock(250);
       if (!rwLock.IsReaderLockHeld)
          return;
       Console.WriteLine("Reader lock held");
       
       LockCookie cookie = rwLock.UpgradeToWriterLock(250);
       if (rwLock.IsWriterLockHeld)
       {
           Console.WriteLine("Upgraded to writer lock");
           rwLock.DowngradeFromWriterLock(ref cookie);
       }
       rwLock.ReleaseReaderLock();
   }

}


 </source>


ReaderWriterLock.ReleaseReaderLock()

<source lang="csharp"> using System; using System.Collections.Generic; using System.Diagnostics; using System.IO; using System.Reflection; using System.Runtime; using System.Runtime.rupilerServices; using System.Security; using System.Text; using System.Threading; class Account {

   public string company ="No Name";
   public decimal balance= 0.0m;
   public DateTime lastUpdate = DateTime.Now;
   public ReaderWriterLock syncLock = new ReaderWriterLock();
   public decimal AutoUpdateBalance(decimal delta)
   {
       syncLock.AcquireWriterLock(-1);
       try
       {
           balance += delta;
           lastUpdate = DateTime.Now;
           return balance;
       }
       finally
       {
           syncLock.ReleaseWriterLock();
       }
   }
   public void GetState(out string company, out decimal balance, out DateTime lastUpdate)
   {
       syncLock.AcquireReaderLock(-1);
       try
       {
           company = this.rupany;
           balance = this.balance;
           lastUpdate = this.lastUpdate;
       }
       finally
       {
           syncLock.ReleaseReaderLock();
       }
   }

}

public class MainClass {

   public static void Main()
   {
       Account account = new Account();
       string company;
       decimal balance;
       DateTime lastUpdate;
       account.GetState(out company, out balance, out lastUpdate);
       Console.WriteLine("{0}, balance: {1}, last updated: {2}",company, balance, lastUpdate);
   }

}


 </source>