Advertisement
AndrejFendel

ReaderWriterLock2

Jul 16th, 2019
551
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C# 2.17 KB | None | 0 0
  1.  
  2. using System.Threading;
  3.  
  4. namespace CollectionReflection
  5. {
  6.     public class ReaderWriterLock
  7.     {
  8.         private readonly ManualResetEvent readersManualResetEvent = new ManualResetEvent(false);
  9.         private readonly ManualResetEvent writersManualResetEvent = new ManualResetEvent(false);
  10.  
  11.         private int readersCounter = 0;
  12.         private int writersCounter = 0;
  13.  
  14.         private int ReadersCounter
  15.         {
  16.             get
  17.             {
  18.                 return readersCounter;
  19.             }
  20.             set
  21.             {
  22.                 if (value < 0)
  23.                 {
  24.                     readersCounter = 0;
  25.                 }
  26.                 else
  27.                 {
  28.                     readersCounter = value;
  29.                 }
  30.             }
  31.         }
  32.  
  33.         private int WritersCounter
  34.         {
  35.             get
  36.             {
  37.                 return writersCounter;
  38.             }
  39.             set
  40.             {
  41.                 if (value < 0)
  42.                 {
  43.                     writersCounter = 0;
  44.                 }
  45.                 else
  46.                 {
  47.                     writersCounter = value;
  48.                 }
  49.             }
  50.         }
  51.  
  52.         public void AcquireReaderLock()
  53.         {
  54.  
  55.             while (WritersCounter > 0)
  56.             {
  57.                 readersManualResetEvent.WaitOne();
  58.             }
  59.             ReadersCounter++;
  60.  
  61.         }
  62.  
  63.         public void ReleaseReaderLock()
  64.         {
  65.  
  66.             ReadersCounter--;
  67.             if (ReadersCounter < 1)
  68.             {
  69.                 writersManualResetEvent.Set();
  70.                 writersManualResetEvent.Reset();
  71.             }
  72.  
  73.         }
  74.  
  75.         public void AcquireWriterLock()
  76.         {
  77.  
  78.             while (ReadersCounter > 0 || WritersCounter > 0)
  79.             {
  80.                 writersManualResetEvent.WaitOne();
  81.             }
  82.             WritersCounter++;
  83.  
  84.         }
  85.  
  86.         public void ReleaseWriterLock()
  87.         {
  88.  
  89.             WritersCounter--;
  90.             readersManualResetEvent.Set();
  91.             readersManualResetEvent.Reset();
  92.             writersManualResetEvent.Set();
  93.             writersManualResetEvent.Reset();
  94.  
  95.         }
  96.     }
  97. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement