public void TestSimpleReadWriteLock() { var sentry = new SimpleReadWriteLock(); var sw = new Stopwatch(); sw.Start(); Task.WaitAll( //first read Task.Run(delegate { using (new SimpleReadLockCookie(sentry)) { Console.WriteLine("Acquired read: {0}ms, thread={1}", sw.ElapsedMilliseconds, Thread.CurrentThread.ManagedThreadId); Thread.Sleep(500); Console.WriteLine("Releasing read: {0}ms, thread={1}", sw.ElapsedMilliseconds, Thread.CurrentThread.ManagedThreadId); } }), //write Task.Run(async delegate { await Task.Delay(100); using (new SimpleWriteLockCookie(sentry)) { Console.WriteLine("Acquired write: {0}ms, thread={1}", sw.ElapsedMilliseconds, Thread.CurrentThread.ManagedThreadId); Thread.Sleep(500); Console.WriteLine("Releasing write: {0}ms, thread={1}", sw.ElapsedMilliseconds, Thread.CurrentThread.ManagedThreadId); } }), //read that starts after write but executes before Task.Run(async delegate { await Task.Delay(200); using (new SimpleReadLockCookie(sentry)) { using (new SimpleReadLockCookie(sentry)) { Console.WriteLine("Acquired read: {0}ms, thread={1}", sw.ElapsedMilliseconds, Thread.CurrentThread.ManagedThreadId); Thread.Sleep(500); Console.WriteLine("Releasing read: {0}ms, thread={1}", sw.ElapsedMilliseconds, Thread.CurrentThread.ManagedThreadId); } } }), //this read task must wait for write on Task.Run(async delegate { await Task.Delay(1000); using (new SimpleReadLockCookie(sentry)) { Console.WriteLine("Acquired read: {0}ms, thread={1}", sw.ElapsedMilliseconds, Thread.CurrentThread.ManagedThreadId); Thread.Sleep(500); Console.WriteLine("Releasing read: {0}ms, thread={1}", sw.ElapsedMilliseconds, Thread.CurrentThread.ManagedThreadId); } }) ); sw.Stop(); Console.WriteLine("Test finished"); }
public SimpleWriteLockCookie(SimpleReadWriteLock rwLock) { (myRwLock = rwLock).AcquireWrite(); }
public SimpleReadLockCookie(SimpleReadWriteLock rwLock) { (myRwLock = rwLock).AcquireRead(); }
public void TestSimpleReadWriteLock() { var sentry = new SimpleReadWriteLock(); var sw = new Stopwatch(); sw.Start(); Task.WaitAll( //first read Task.Run(delegate { using (new SimpleReadLockCookie(sentry)) { Console.WriteLine("Acquired read: {0}ms, thread={1}", sw.ElapsedMilliseconds, Thread.CurrentThread.ManagedThreadId); Thread.Sleep(500); Console.WriteLine("Releasing read: {0}ms, thread={1}", sw.ElapsedMilliseconds, Thread.CurrentThread.ManagedThreadId); } }), //write Task.Run(async delegate { await Task.Delay(100); using (new SimpleWriteLockCookie(sentry)) { Console.WriteLine("Acquired write: {0}ms, thread={1}", sw.ElapsedMilliseconds, Thread.CurrentThread.ManagedThreadId); Thread.Sleep(500); Console.WriteLine("Releasing write: {0}ms, thread={1}", sw.ElapsedMilliseconds, Thread.CurrentThread.ManagedThreadId); } }), //read that starts after write but executes before Task.Run(async delegate { await Task.Delay(200); using (new SimpleReadLockCookie(sentry)) { using (new SimpleReadLockCookie(sentry)) { Console.WriteLine("Acquired read: {0}ms, thread={1}", sw.ElapsedMilliseconds, Thread.CurrentThread.ManagedThreadId); Thread.Sleep(500); Console.WriteLine("Releasing read: {0}ms, thread={1}", sw.ElapsedMilliseconds, Thread.CurrentThread.ManagedThreadId); } } }), //this read task must wait for write on Task.Run(async delegate { await Task.Delay(1000); using (new SimpleReadLockCookie(sentry)) { Console.WriteLine("Acquired read: {0}ms, thread={1}", sw.ElapsedMilliseconds, Thread.CurrentThread.ManagedThreadId); Thread.Sleep(500); Console.WriteLine("Releasing read: {0}ms, thread={1}", sw.ElapsedMilliseconds, Thread.CurrentThread.ManagedThreadId); } }) ); sw.Stop(); Console.WriteLine("Test finished"); }