C#多线程编程实例实战(4) 注意在程序中,释放锁时,只会唤醒一个阅读程序,这是因为使用AutoResetEvent的原历,读者可自行将其改成ManualResetEvent,同时唤醒多个阅读程序,此时应令m_nActive等于整个等待的阅读线程数目。 申请写入锁的函数原型为:public void AcquireWriterLock( int millisecondsTimeout ),其中的参数为等待调度的时间。函数定义如下: public void AcquireWriterLock( int millisecondsTimeout ) { // m_mutext很快可以得到,以便进入临界区 m_mutex.WaitOne( ); // 是否有活动线程存在 bool bNoActive = m_nActive == 0; if( !bNoActive ) { m_nWaitingWriters++; } else { m_nActive--; } m_mutex.ReleaseMutex(); //存储线程锁标志 System.LocalDataStoreSlot slot = Thread.GetNamedDataSlot( "myReaderWriterLockDataSlot" ); object obj = Thread.GetData( slot ); LockFlags flag = LockFlags.None; if( obj != null ) flag = (LockFlags)Thread.GetData( slot ); if( flag == LockFlags.None ) { Thread.SetData( slot, LockFlags.Writer ); } else { Thread.SetData( slot, (LockFlags)((int)flag (int)LockFlags.Writer ) ); } //如果有活动线程,等待指定的时间 if( !bNoActive ) this.m_aeWriters.WaitOne( millisecondsTimeout, true ); } 它首先进入临界区判断当前活动线程的数目,如果当前有活动线程存在,不管是写线程还是读线程(m_nActive),线程将等待指定的时间并且等待的写入线程数目加1,否则线程拥有写的权限。 释放阅读锁的函数原型为:public void ReleaseReaderLock()。函数定义如下: public void ReleaseReaderLock() { System.LocalDataStoreSlot slot = Thread.GetNamedDataSlot(m_strThreadSlotName ); LockFlags flag = (LockFlags)Thread.GetData( slot ); if( flag == LockFlags.None ) { return;