예제 #1
0
        public void Test()
        {
            System.Console.WriteLine("\nTest case 3 start!");
            ReentrantReaderWriterLock rwLock = new ReentrantReaderWriterLock();
            ManualResetEvent          mre    = new ManualResetEvent(false);
            int threadCount = 2;

            // 测试读锁重入写锁
            Task.Run(() =>
            {
                rwLock.EnterWriteLock();
                rwLock.EnterReadLock();
                rwLock.EnterReadLock();
                System.Console.WriteLine("读锁重入写锁成功");
                rwLock.ExitReadLock();
                rwLock.ExitReadLock();
                rwLock.ExitWriteLock();
                Interlocked.Decrement(ref threadCount);
                if (threadCount == 0)
                {
                    mre.Set();
                }
            });
            // 测试写锁重入写锁
            Task.Run(() =>
            {
                rwLock.EnterWriteLock();
                rwLock.EnterWriteLock();
                rwLock.EnterWriteLock();
                System.Console.WriteLine("写锁重入写锁成功");
                rwLock.ExitWriteLock();
                rwLock.ExitWriteLock();
                rwLock.ExitWriteLock();
                Interlocked.Decrement(ref threadCount);
                if (threadCount == 0)
                {
                    mre.Set();
                }
            });

            mre.WaitOne();
            // 测试读锁重入读锁
            Task.Run(() =>
            {
                rwLock.EnterReadLock();
                rwLock.EnterReadLock();
                System.Console.WriteLine("读锁重入读锁成功");
                rwLock.EnterReadLock();
                rwLock.EnterReadLock();
            });
        }
        public TestCase2()
        {
            readWaitTime     = 0;
            writeWaitTime    = 0;
            readerWriterLock = new ReentrantReaderWriterLock();

            writerThreadNum     = 0;
            readerThreadNum     = 0;
            totalThreadNum      = 1024;
            finishedWorkerCount = 0;
            finished            = new AutoResetEvent(false);

            monitorLockObj          = new object();
            baselineWriterWaitCount = 0;
        }