home *** CD-ROM | disk | FTP | other *** search
- /*============================================================
- ** Class: ReadWriteLock.cs
- ** Copyright (c) Microsoft, 1999-2000
- ===========================================================*/
- using System;
- using System.Threading;
-
- public class ReadWriteLock
- {
- public int OutX;
- public int ReadX;
- public int WriteX;
- public static ReaderWriterLock rwLock = new ReaderWriterLock( );
- ReadWriteLock()
- {
- }
- void ReaderFunc( )
- {
- int ReadL = Interlocked.Increment(ref ReadX);
- LockCookie upgradeCookie = new LockCookie( );
- try
- {
- if((rwLock.IsReaderLockHeld)||(rwLock.IsWriterLockHeld))
- lock(this)
- Console.WriteLine(" {0}, Reader -BAD- No Locks should be held now.",ReadL);
- }
- catch(Exception e)
- {
- lock(this)
- Console.WriteLine(" {0}, Reader -BAD- (IsReaderLockHeld || IsWriterLockHeld) {1}",ReadL,e.ToString());
- }
- try
- {
- lock(this)
- Console.WriteLine(" {0}, Reader -fyi- Before AcquireReaderLock.",ReadL);
-
- rwLock.AcquireReaderLock(1000);
-
- lock(this)
- Console.WriteLine(" {0}, Reader -fyi- After AcquireReaderLock.",ReadL);
- }
- catch(Exception e)
- {
- lock(this)
- Console.WriteLine(" {0}, Reader -BAD- (AcquireReaderLock) {1}",ReadL,e.ToString());
- }
- Thread.Sleep(10);
- try
- {
- if(!(rwLock.IsReaderLockHeld))
- lock(this)
- Console.WriteLine(" {0}, Reader -BAD- ReaderLock FALSE",ReadL);
-
- lock(this)
- Console.WriteLine(" {0}, Reader -fyi- Before UpgradeToWriterLock.",ReadL);
-
- upgradeCookie = rwLock.UpgradeToWriterLock(1000);
-
- lock(this)
- Console.WriteLine(" {0}, Reader -fyi- After UpgradeToWriterLock.",ReadL);
- }
- catch(Exception e)
- {
- lock(this)
- Console.WriteLine(" {0}, Reader -BAD- (UpgradeToWriterLock) {1}",ReadL,e.ToString());
- }
- try
- {
- if(rwLock.IsReaderLockHeld)
- {
- lock(this)
- Console.WriteLine(" {0}, Reader -BAD- ReaderLock TRUE",ReadL);
- }
-
- if(!(rwLock.IsWriterLockHeld))
- {
- lock(this)
- Console.WriteLine(" {0}, Reader -BAD- WriterLock FALSE",ReadL);
- }
-
- lock(this)
- Console.WriteLine(" {0}, Reader -fyi- Before DowngradeFromWriterLock.",ReadL);
-
- rwLock.DowngradeFromWriterLock(ref upgradeCookie);
-
- lock(this)
- Console.WriteLine(" {0}, Reader -fyi- After DowngradeFromWriterLock.",ReadL);
- }
- catch(Exception e)
- {
- lock(this)
- Console.WriteLine(" {0}, Reader -BAD- (DowngradeFromWriterLock) {1}",ReadL,e.ToString());
- }
- try
- {
- if(rwLock.IsWriterLockHeld)
- lock(this)
- Console.WriteLine(" {0}, Reader -BAD- WriterLock TRUE",ReadL);
-
- if(!(rwLock.IsReaderLockHeld))
- lock(this)
- Console.WriteLine(" {0}, Reader -BAD- ReaderLock should be held now.",ReadL);
-
- lock(this)
- Console.WriteLine(" {0}, Reader -fyi- Before ReleaseReaderLock.",ReadL);
-
- rwLock.ReleaseReaderLock( );
-
- lock(this)
- Console.WriteLine(" {0}, Reader -fyi- After ReleaseReaderLock.",ReadL);
- }
- catch(Exception e)
- {
- lock(this)
- Console.WriteLine(" {0}, Reader -BAD- (ReleaseReaderLock) {1}",ReadL,e.ToString());
- }
- try
- {
- if((rwLock.IsReaderLockHeld)||(rwLock.IsWriterLockHeld))
- lock(this)
- Console.WriteLine(" {0}, Reader -BAD- No Locks should be held now.",ReadL);
- }
- catch(Exception e)
- {
- lock(this)
- Console.WriteLine(" {0}, Reader - {1}",ReadL,e.ToString());
- }
- }
- void WriterFunc( )
- {
- int WriteL = Interlocked.Increment(ref WriteX);
- LockCookie releaseCookie = new LockCookie( );
- int iWriterSeqNum;
- if((rwLock.IsReaderLockHeld)||(rwLock.IsWriterLockHeld))
- lock(this)
- Console.WriteLine("{0}, Writer -BAD- No Locks should be held now. (I)",WriteL);
- try
- {
- lock(this)
- Console.WriteLine("{0}, Writer -fyi- Before AcquireWriterLock.",WriteL);
-
- rwLock.AcquireWriterLock(1000);
-
- lock(this)
- Console.WriteLine("{0}, Writer -fyi- After AcquireWriterLock.",WriteL);
- }
- catch(Exception e)
- {
- lock(this)
- Console.WriteLine("{0}, Writer -BAD- (AcquireWriterLock) {1}",WriteL,e.ToString());
- }
- Thread.Sleep(10);
- try
- {
- if(!(rwLock.IsWriterLockHeld))
- lock(this)
- Console.WriteLine("{0}, Writer -BAD- WriterLock should be held now. (I)",WriteL);
-
- iWriterSeqNum = rwLock.WriterSeqNum;
-
- lock(this)
- Console.WriteLine("{0}, Writer -fyi- Before ReleaseLock.",WriteL);
-
- releaseCookie = rwLock.ReleaseLock( );
-
- lock(this)
- Console.WriteLine("{0}, Writer -fyi- After ReleaseLock.",WriteL);
-
- if((rwLock.IsReaderLockHeld)||(rwLock.IsWriterLockHeld))
- lock(this)
- Console.WriteLine("{0}, Writer -BAD- No Locks should be held now. (II)",WriteL);
-
- lock(this)
- Console.WriteLine("{0}, Writer -fyi- Before RestoreLock.",WriteL);
-
- rwLock.RestoreLock(ref releaseCookie);
-
- lock(this)
- Console.WriteLine("{0}, Writer -fyi- After RestoreLock.",WriteL);
-
- if(!(rwLock.IsWriterLockHeld))
- lock(this)
- Console.WriteLine("{0}, Writer -BAD- WriterLock should be held now. (II)",WriteL);
-
- lock(this)
- Console.WriteLine("{0}, Writer -fyi- Before ReleaseWriterLock.",WriteL);
-
- rwLock.ReleaseWriterLock( );
-
- lock(this)
- Console.WriteLine("{0}, Writer -fyi- After ReleaseWriterLock.",WriteL);
-
- bool boX;
- boX = rwLock.AnyWritersSince(iWriterSeqNum);
- iWriterSeqNum = rwLock.WriterSeqNum;
- boX = rwLock.AnyWritersSince(iWriterSeqNum);
- }
- catch(Exception e)
- {
- lock(this)
- Console.WriteLine("{0}, Writer - {1}",WriteL,e.ToString());
- }
- }
- static public int Main(String[] args)
- {
- Thread thrd;
- ReadWriteLock XYZ = new ReadWriteLock( );
- XYZ.OutX = 0;
- XYZ.ReadX = 0;
- XYZ.WriteX = 10;
- ThreadStart reader = new ThreadStart(XYZ.ReaderFunc);
- ThreadStart writer = new ThreadStart(XYZ.WriterFunc);
- for (int i=0;i<4;i++)
- {
- thrd = new Thread(reader);
- thrd.Start( );
- }
- for (int i=0;i<4;i++)
- {
- thrd = new Thread(writer);
- thrd.Start( );
- }
- return 0;
- }
- }
-
-