Csharp/CSharp Tutorial/Thread/ReaderWriterLock — различия между версиями

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

Текущая версия на 15:20, 26 мая 2010

Reader Lock

<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>

Reader lock held
Upgraded to writer lock

Using a reader-writer lock to protect a complex business type

<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>

No Name, balance: 0.0, last updated: 25/03/2007 3:04:25 PM

Writer Lock

<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>

Writer lock held
Unhandled Exception: System.ApplicationException: Attempt to release mutex not owned by caller. (Exc
eption from HRESULT: 0x00000120)
   at System.Threading.ReaderWriterLock.ReleaseWriterLockInternal()
   at MainClass.Main()