Exemple #1
0
 public ReadWriteLock()
 {
     mWritingThread = null;
     mWriteRequests = new Queue <Thread>();
     mReaderDict    = new Dictionary <Thread, int>();
     mLock          = new object();
 }
Exemple #2
0
        public void lockWrite()
        {
            Monitor.Enter(mLock);
            try {
                Thread thisThread = Thread.CurrentThread;
                /*如果没有写线程 或者 请求写的线程不是当前正在写的线程(不是写重入), 就加入写队列*/
                if (mWritingThread == null || thisThread != mWritingThread.WritingThread)
                {
                    mWriteRequests.Enqueue(thisThread);
                }
                while (!canWrite(thisThread))   //如果当前线程无法写,等待
                {
                    Monitor.Wait(mLock);
                }

                if (null == mWritingThread)   //不是写重入
                {
                    mWritingThread = new CurrentWritingThread(thisThread);
                    mWriteRequests.Dequeue();//从写请求队列中删除
                }
                else  //写重入
                {
                    mWritingThread.writeCount++;
                }
            }
            catch (ThreadInterruptedException e) {
                throw e;
            }
            finally {
                Monitor.Exit(mLock);
            }
        }
Exemple #3
0
        public void unlockWrite()
        {
            Monitor.Enter(mLock);
            try {
                Thread thisThread = Thread.CurrentThread;
                if (1 == mWritingThread.writeCount) // 如果不是重入的写锁
                {
                    mWritingThread = null;          //把当前正在写的线程记为null
                }
                else
                {
                    mWritingThread.writeCount--; // 重入计数减一
                }

                Monitor.PulseAll(mLock); //唤醒所有线程
            }
            catch (ThreadInterruptedException e) {
                throw e;
            }
            finally {
                Monitor.Exit(mLock);
            }
        }