Пример #1
0
        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");
        }
Пример #2
0
 public SimpleWriteLockCookie(SimpleReadWriteLock rwLock)
 {
     (myRwLock = rwLock).AcquireWrite();
 }
Пример #3
0
 public SimpleReadLockCookie(SimpleReadWriteLock rwLock)
 {
     (myRwLock = rwLock).AcquireRead();
 }
Пример #4
0
        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");
        }