public void EnterReadLock() { SpinWait sw = new SpinWait(); do { while ((rwlock & (RwWrite | RwWait)) > 0) { sw.SpinOnce(); } if ((Interlocked.Add(ref rwlock, RwRead) & (RwWait | RwWait)) == 0) { return; } Interlocked.Add(ref rwlock, -RwRead); } while (true); }
public void ExitWriteLock() { Interlocked.Add(ref rwlock, -RwWrite); }
public void ExitReadLock() { Interlocked.Add(ref rwlock, -RwRead); }