public ReadWriteLock() { mWritingThread = null; mWriteRequests = new Queue <Thread>(); mReaderDict = new Dictionary <Thread, int>(); mLock = new object(); }
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); } }
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); } }