Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- using System.Threading;
- namespace CollectionReflection
- {
- public class ReaderWriterLock
- {
- private int readersCounter = 0;
- private int writersCounter = 0;
- private object sync = new object();
- private int ReadersCounter
- {
- get
- {
- return readersCounter;
- }
- set
- {
- if (value < 0)
- {
- readersCounter = 0;
- }
- else
- {
- readersCounter = value;
- }
- }
- }
- private int WritersCounter
- {
- get
- {
- return writersCounter;
- }
- set
- {
- if (value < 0)
- {
- writersCounter = 0;
- }
- else
- {
- writersCounter = value;
- }
- }
- }
- public void AcquireReaderLock()
- {
- lock (sync)
- {
- while (WritersCounter > 0)
- {
- Monitor.Wait(sync);
- }
- ReadersCounter++;
- }
- }
- public void ReleaseReaderLock()
- {
- lock (sync)
- {
- ReadersCounter--;
- if (ReadersCounter < 1)
- {
- Monitor.Pulse(sync);
- }
- }
- }
- public void AcquireWriterLock()
- {
- lock (sync)
- {
- while (ReadersCounter > 0 || WritersCounter > 0)
- {
- Monitor.Wait(sync);
- }
- WritersCounter++;
- }
- }
- public void ReleaseWriterLock()
- {
- lock (sync)
- {
- WritersCounter--;
- Monitor.PulseAll(sync);
- }
- }
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement