home *** CD-ROM | disk | FTP | other *** search
/ io Programmo 40 / IOPROG_40.ISO / SOFT / NETFrameworkSDK.exe / comsdk.cab / samples.exe / Threading / ReaderWriterLock / CS_Sample / ReadWriteLock.cs < prev   
Encoding:
Text File  |  2000-06-23  |  5.9 KB  |  227 lines

  1. /*============================================================
  2. ** Class:    ReadWriteLock.cs
  3. ** Copyright (c) Microsoft, 1999-2000
  4. ===========================================================*/
  5. using System;
  6. using System.Threading;
  7.  
  8. public class ReadWriteLock
  9. {
  10.     public int                        OutX;
  11.     public int                        ReadX;
  12.     public int                        WriteX;
  13.     public static ReaderWriterLock    rwLock    = new ReaderWriterLock( );
  14.     ReadWriteLock()
  15.     {
  16.     }
  17.     void ReaderFunc( )
  18.     {    
  19.         int            ReadL            = Interlocked.Increment(ref ReadX);
  20.         LockCookie    upgradeCookie    = new LockCookie( );
  21.         try
  22.         {
  23.             if((rwLock.IsReaderLockHeld)||(rwLock.IsWriterLockHeld))
  24.                 lock(this)
  25.                     Console.WriteLine(" {0}, Reader -BAD- No Locks should be held now.",ReadL);
  26.         }
  27.         catch(Exception e)
  28.         {
  29.             lock(this)
  30.                 Console.WriteLine(" {0}, Reader -BAD- (IsReaderLockHeld || IsWriterLockHeld) {1}",ReadL,e.ToString());
  31.         }
  32.         try
  33.         {
  34.             lock(this)
  35.                 Console.WriteLine(" {0}, Reader -fyi- Before AcquireReaderLock.",ReadL);
  36.  
  37.             rwLock.AcquireReaderLock(1000);
  38.  
  39.             lock(this)
  40.                 Console.WriteLine(" {0}, Reader -fyi- After  AcquireReaderLock.",ReadL);
  41.         }
  42.         catch(Exception e)
  43.         {
  44.             lock(this)
  45.                 Console.WriteLine(" {0}, Reader -BAD- (AcquireReaderLock) {1}",ReadL,e.ToString());
  46.         }
  47.         Thread.Sleep(10);
  48.         try
  49.         {
  50.             if(!(rwLock.IsReaderLockHeld))
  51.                 lock(this)
  52.                     Console.WriteLine(" {0}, Reader -BAD- ReaderLock  FALSE",ReadL);
  53.  
  54.             lock(this)
  55.                 Console.WriteLine(" {0}, Reader -fyi- Before UpgradeToWriterLock.",ReadL);
  56.  
  57.             upgradeCookie = rwLock.UpgradeToWriterLock(1000);
  58.  
  59.             lock(this)
  60.                 Console.WriteLine(" {0}, Reader -fyi- After  UpgradeToWriterLock.",ReadL);
  61.         }
  62.         catch(Exception e)
  63.         {
  64.             lock(this)
  65.                 Console.WriteLine(" {0}, Reader -BAD- (UpgradeToWriterLock) {1}",ReadL,e.ToString());
  66.         }
  67.         try
  68.         {
  69.             if(rwLock.IsReaderLockHeld)
  70.             {
  71.                 lock(this)
  72.                     Console.WriteLine(" {0}, Reader -BAD- ReaderLock  TRUE",ReadL);
  73.             }
  74.  
  75.             if(!(rwLock.IsWriterLockHeld))
  76.             {
  77.                 lock(this)
  78.                     Console.WriteLine(" {0}, Reader -BAD- WriterLock  FALSE",ReadL);
  79.             }
  80.  
  81.             lock(this)
  82.                 Console.WriteLine(" {0}, Reader -fyi- Before DowngradeFromWriterLock.",ReadL);
  83.  
  84.             rwLock.DowngradeFromWriterLock(ref upgradeCookie);
  85.  
  86.             lock(this)
  87.                 Console.WriteLine(" {0}, Reader -fyi- After  DowngradeFromWriterLock.",ReadL);
  88.         }
  89.         catch(Exception e)
  90.         {
  91.             lock(this)
  92.                 Console.WriteLine(" {0}, Reader -BAD- (DowngradeFromWriterLock) {1}",ReadL,e.ToString());
  93.         }
  94.         try
  95.         {
  96.             if(rwLock.IsWriterLockHeld)
  97.                 lock(this)
  98.                     Console.WriteLine(" {0}, Reader -BAD- WriterLock  TRUE",ReadL);
  99.  
  100.             if(!(rwLock.IsReaderLockHeld))
  101.                 lock(this)
  102.                     Console.WriteLine(" {0}, Reader -BAD- ReaderLock should be held now.",ReadL);
  103.  
  104.             lock(this)
  105.                 Console.WriteLine(" {0}, Reader -fyi- Before ReleaseReaderLock.",ReadL);
  106.  
  107.             rwLock.ReleaseReaderLock( );
  108.  
  109.             lock(this)
  110.                 Console.WriteLine(" {0}, Reader -fyi- After  ReleaseReaderLock.",ReadL);
  111.         }
  112.         catch(Exception e)
  113.         {
  114.             lock(this)
  115.                 Console.WriteLine(" {0}, Reader -BAD- (ReleaseReaderLock) {1}",ReadL,e.ToString());
  116.         }
  117.         try
  118.         {
  119.             if((rwLock.IsReaderLockHeld)||(rwLock.IsWriterLockHeld))
  120.                 lock(this)
  121.                     Console.WriteLine(" {0}, Reader -BAD- No Locks should be held now.",ReadL);
  122.         }
  123.         catch(Exception e)
  124.         {
  125.             lock(this)
  126.                 Console.WriteLine(" {0}, Reader - {1}",ReadL,e.ToString());
  127.         }
  128.     }
  129.     void WriterFunc( )
  130.     {    
  131.         int            WriteL            = Interlocked.Increment(ref WriteX);
  132.         LockCookie    releaseCookie    = new LockCookie( );
  133.         int            iWriterSeqNum;
  134.         if((rwLock.IsReaderLockHeld)||(rwLock.IsWriterLockHeld))
  135.             lock(this)
  136.                 Console.WriteLine("{0}, Writer -BAD- No Locks should be held now. (I)",WriteL);
  137.         try
  138.         {
  139.             lock(this)
  140.                 Console.WriteLine("{0}, Writer -fyi- Before AcquireWriterLock.",WriteL);
  141.  
  142.             rwLock.AcquireWriterLock(1000);
  143.  
  144.             lock(this)
  145.                 Console.WriteLine("{0}, Writer -fyi- After  AcquireWriterLock.",WriteL);
  146.         }
  147.         catch(Exception e)
  148.         {
  149.             lock(this)
  150.                 Console.WriteLine("{0}, Writer -BAD- (AcquireWriterLock) {1}",WriteL,e.ToString());
  151.         }
  152.         Thread.Sleep(10);
  153.         try
  154.         {
  155.             if(!(rwLock.IsWriterLockHeld))
  156.                 lock(this)
  157.                     Console.WriteLine("{0}, Writer -BAD- WriterLock should be held now. (I)",WriteL);
  158.  
  159.             iWriterSeqNum = rwLock.WriterSeqNum;
  160.  
  161.             lock(this)
  162.                 Console.WriteLine("{0}, Writer -fyi- Before ReleaseLock.",WriteL);
  163.  
  164.             releaseCookie = rwLock.ReleaseLock( );
  165.  
  166.             lock(this)
  167.                 Console.WriteLine("{0}, Writer -fyi- After  ReleaseLock.",WriteL);
  168.  
  169.             if((rwLock.IsReaderLockHeld)||(rwLock.IsWriterLockHeld))
  170.                 lock(this)
  171.                     Console.WriteLine("{0}, Writer -BAD- No Locks should be held now. (II)",WriteL);
  172.  
  173.             lock(this)
  174.                 Console.WriteLine("{0}, Writer -fyi- Before RestoreLock.",WriteL);
  175.  
  176.             rwLock.RestoreLock(ref releaseCookie);
  177.  
  178.             lock(this)
  179.                 Console.WriteLine("{0}, Writer -fyi- After  RestoreLock.",WriteL);
  180.  
  181.             if(!(rwLock.IsWriterLockHeld))
  182.                 lock(this)
  183.                     Console.WriteLine("{0}, Writer -BAD- WriterLock should be held now. (II)",WriteL);
  184.  
  185.             lock(this)
  186.                 Console.WriteLine("{0}, Writer -fyi- Before ReleaseWriterLock.",WriteL);
  187.  
  188.             rwLock.ReleaseWriterLock( );
  189.  
  190.             lock(this)
  191.                 Console.WriteLine("{0}, Writer -fyi- After  ReleaseWriterLock.",WriteL);
  192.  
  193.             bool    boX;
  194.             boX = rwLock.AnyWritersSince(iWriterSeqNum);
  195.             iWriterSeqNum = rwLock.WriterSeqNum;
  196.             boX    = rwLock.AnyWritersSince(iWriterSeqNum);
  197.         }
  198.         catch(Exception e)
  199.         {
  200.             lock(this)
  201.                 Console.WriteLine("{0}, Writer - {1}",WriteL,e.ToString());
  202.         }
  203.     }
  204.     static public int Main(String[] args)
  205.     {
  206.         Thread                    thrd;
  207.         ReadWriteLock            XYZ        = new ReadWriteLock( );
  208.         XYZ.OutX = 0;
  209.         XYZ.ReadX = 0;
  210.         XYZ.WriteX = 10;
  211.         ThreadStart                reader    = new ThreadStart(XYZ.ReaderFunc);
  212.         ThreadStart                writer    = new ThreadStart(XYZ.WriterFunc);
  213.         for (int i=0;i<4;i++)
  214.         {
  215.             thrd = new Thread(reader);
  216.             thrd.Start( );
  217.         }
  218.         for (int i=0;i<4;i++)
  219.         {
  220.             thrd = new Thread(writer);
  221.             thrd.Start( );
  222.         }
  223.         return 0;
  224.     }
  225. }
  226.  
  227.