Advertisement
AndrejFendel

ReaderWriterLock

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