usingSystem;usingSystem.Diagnostics;usingSystem.Globalization;usingSystem.Threading;namespaceHslCommunication.Core{#region多线程同步协调类///<summary>///线程的协调逻辑状态///</summary>internalenumCoordinationStatus{///<summary>///所有项完成///</summary>AllDone,///<summary>///超时///</summary>Timeout,///<summary>///任务取消///</summary>Cancel}///<summary>///一个线程协调逻辑类,详细参考书籍《CLRViaC#》page:681///这个类可惜没有报告进度的功能///</summary>internalsealedclassAsyncCoordinator{privateintm_opCount=1;privateintm_statusReported=0;privateAction<CoordinationStatus>m_callback;privateSystem.Threading.Timerm_timer;///<summary>///每次的操作任务开始前必须调用该方法///</summary>///<paramname="opsToAdd"></param>publicvoidAboutToBegin(intopsToAdd=1)=>Interlocked.Add(refm_opCount,opsToAdd);///<summary>///在一次任务处理好操作之后,必须调用该方法///</summary>publicvoidJustEnded(){if(Interlocked.Decrement(refm_opCount)==0){ReportStatus(CoordinationStatus.AllDone);}}///<summary>///该方法必须在发起所有的操作之后调用///</summary>///<paramname="callback">回调方法</param>///<paramname="timeout">超时时间</param>publicvoidAllBegun(Action<CoordinationStatus>callback,inttimeout=Timeout.Infinite){m_callback=callback;if(timeout!=Timeout.Infinite){m_timer=newSystem.Threading.Timer(TimeExpired,null,timeout,Timeout.Infinite);}JustEnded();//修正一开始设置的初始值}///<summary>///超时的方法///</summary>///<paramname="o"></param>privatevoidTimeExpired(objecto)=>ReportStatus(CoordinationStatus.Timeout);///<summary>///取消任务的执行///</summary>publicvoidCancel()=>ReportStatus(CoordinationStatus.Cancel);///<summary>///生成一次报告///</summary>///<paramname="status">报告的状态</param>privatevoidReportStatus(CoordinationStatusstatus){//只报告一次的限制if(Interlocked.Exchange(refm_statusReported,1)==0){m_callback(status);}}///<summary>///乐观的并发方法模型,具体参照《CLRViaC#》page:686///</summary>///<paramname="target">唯一的目标数据</param>///<paramname="change">修改数据的算法</param>///<returns></returns>publicstaticintMaxinum(refinttarget,Func<int,int>change){intcurrentVal=target,startVal,desiredVal;do{startVal=currentVal;//设置值//以下为业务逻辑,允许实现非常复杂的设置desiredVal=change(startVal);currentVal=Interlocked.CompareExchange(reftarget,desiredVal,startVal);}while(startVal!=currentVal);//更改失败就强制更新returndesiredVal;}}#endregion#region乐观并发模型的协调类///<summary>///一个用于高性能,乐观并发模型控制操作的类,允许一个方法(隔离方法)的安全单次执行///</summary>publicsealedclassHslAsyncCoordinator{///<summary>///实例化一个对象,需要传入隔离执行的方法///</summary>///<paramname="operater">隔离执行的方法</param>publicHslAsyncCoordinator(Actionoperater){action=operater;}///<summary>///操作状态,0是未操作,1是操作中///</summary>privateintOperaterStatus=0;///<summary>///需要操作的次数///</summary>privatelongTarget=0;///<summary>///启动线程池执行隔离方法///</summary>publicvoidStartOperaterInfomation(){Interlocked.Increment(refTarget);if(Interlocked.CompareExchange(refOperaterStatus,1,0)==0){//启动保存ThreadPool.QueueUserWorkItem(newWaitCallback(ThreadPoolOperater),null);}}privateActionaction=null;privatevoidThreadPoolOperater(objectobj){longcurrentVal=Target,startVal;longdesiredVal=0;do{startVal=currentVal;//设置值//以下为业务逻辑,允许实现非常复杂的设置action?.Invoke();//需要清零值的时候必须用下面的原子操作currentVal=Interlocked.CompareExchange(refTarget,desiredVal,startVal);}while(startVal!=currentVal);//更改失败就强制更新//退出保存状态Interlocked.Exchange(refOperaterStatus,0);//最终状态确认if(Target!=desiredVal)StartOperaterInfomation();}}#endregion#region高性能的读写锁//一个高性能的读写锁,由《CLRViaC#》作者JeffreyRichter提供///<summary>///一个高性能的读写锁,支持写锁定,读灵活,读时写锁定,写时读锁定///</summary>publicsealedclassHslReadWriteLock:IDisposable{#regionLockStateManagement#iffalseprivatestructBitField{privateintm_mask,m_1,m_startBit;publicBitField(intstartBit,intnumBits){m_startBit=startBit;m_mask=unchecked((int)((1<<numBits)-1)<<startBit);m_1=unchecked((int)1<<startBit);}publicvoidIncrement(refintvalue){value+=m_1;}publicvoidDecrement(refintvalue){value-=m_1;}publicvoidDecrement(refintvalue,intamount){value-=m_1*amount;}publicintGet(intvalue){return(value&m_mask)>>m_startBit;}publicintSet(intvalue,intfieldValue){return(value&~m_mask)|(fieldValue<<m_startBit);}}privatestaticBitFields_state=newBitField(0,3);privatestaticBitFields_readersReading=newBitField(3,9);privatestaticBitFields_readersWaiting=newBitField(12,9);privatestaticBitFields_writersWaiting=newBitField(21,9);privatestaticOneManyLockStatesState(intvalue){return(OneManyLockStates)s_state.Get(value);}privatestaticvoidState(refintls,OneManyLockStatesnewState){ls=s_state.Set(ls,(int)newState);}#endifprivateenumOneManyLockStates{Free=0x00000000,OwnedByWriter=0x00000001,OwnedByReaders=0x00000002,OwnedByReadersAndWriterPending=0x00000003,ReservedForWriter=0x00000004,}privateconstintc_lsStateStartBit=0;privateconstintc_lsReadersReadingStartBit=3;privateconstintc_lsReadersWaitingStartBit=12;privateconstintc_lsWritersWaitingStartBit=21;//Mask=unchecked((int)((1<<numBits)-1)<<startBit);privateconstintc_lsStateMask=unchecked((int)((1<<3)-1)<<c_lsStateStartBit);privateconstintc_lsReadersReadingMask=unchecked((int)((1<<9)-1)<<c_lsReadersReadingStartBit);privateconstintc_lsReadersWaitingMask=unchecked((int)((1<<9)-1)<<c_lsReadersWaitingStartBit);privateconstintc_lsWritersWaitingMask=unchecked((int)((1<<9)-1)<<c_lsWritersWaitingStartBit);privateconstintc_lsAnyWaitingMask=c_lsReadersWaitingMask|c_lsWritersWaitingMask;//FirstBit=unchecked((int)1<<startBit);privateconstintc_ls1ReaderReading=unchecked((int)1<<c_lsReadersReadingStartBit);privateconstintc_ls1ReaderWaiting=unchecked((int)1<<c_lsReadersWaitingStartBit);privateconstintc_ls1WriterWaiting=unchecked((int)1<<c_lsWritersWaitingStartBit);privatestaticOneManyLockStatesState(intls){return(OneManyLockStates)(ls&c_lsStateMask);}privatestaticvoidSetState(refintls,OneManyLockStatesnewState){ls=(ls&~c_lsStateMask)|((int)newState);}privatestaticintNumReadersReading(intls){return(ls&c_lsReadersReadingMask)>>c_lsReadersReadingStartBit;}privatestaticvoidAddReadersReading(refintls,intamount){ls+=(c_ls1ReaderReading*amount);}privatestaticintNumReadersWaiting(intls){return(ls&c_lsReadersWaitingMask)>>c_lsReadersWaitingStartBit;}privatestaticvoidAddReadersWaiting(refintls,intamount){ls+=(c_ls1ReaderWaiting*amount);}privatestaticintNumWritersWaiting(intls){return(ls&c_lsWritersWaitingMask)>>c_lsWritersWaitingStartBit;}privatestaticvoidAddWritersWaiting(refintls,intamount){ls+=(c_ls1WriterWaiting*amount);}privatestaticboolAnyWaiters(intls){return(ls&c_lsAnyWaitingMask)!=0;}privatestaticstringDebugState(intls){returnstring.Format(CultureInfo.InvariantCulture,"State={0}, RR={1}, RW={2}, WW={3}",State(ls),NumReadersReading(ls),NumReadersWaiting(ls),NumWritersWaiting(ls));}///<summary>///返回本对象的描述字符串///</summary>///<returns>对象的描述字符串</returns>publicoverridestringToString(){returnDebugState(m_LockState);}#endregion#regionStateFieldsprivateintm_LockState=(int)OneManyLockStates.Free;//ReaderswaitonthisifawriterownsthelockprivateSemaphorem_ReadersLock=newSemaphore(0,int.MaxValue);//WriterswaitonthisifareaderownsthelockprivateSemaphorem_WritersLock=newSemaphore(0,int.MaxValue);#endregion#regionConstruction///<summary>///实例化一个读写锁的对象///</summary>publicHslReadWriteLock():base(){}#endregion#regionIDisposableSupportprivatebooldisposedValue=false;//要检测冗余调用voidDispose(booldisposing){if(!disposedValue){if(disposing){//TODO:释放托管状态(托管对象)。}//TODO:释放未托管的资源(未托管的对象)并在以下内容中替代终结器。//TODO:将大型字段设置为null。m_WritersLock.Close();m_WritersLock=null;m_ReadersLock.Close();m_ReadersLock=null;disposedValue=true;}}//TODO:仅当以上Dispose(booldisposing)拥有用于释放未托管资源的代码时才替代终结器。//~HslReadWriteLock(){////请勿更改此代码。将清理代码放入以上Dispose(booldisposing)中。//Dispose(false);//}//添加此代码以正确实现可处置模式。///<summary>///释放资源///</summary>publicvoidDispose(){//请勿更改此代码。将清理代码放入以上Dispose(booldisposing)中。Dispose(true);//TODO:如果在以上内容中替代了终结器,则取消注释以下行。//GC.SuppressFinalize(this);}#endregion#regionWritermembersprivateboolm_exclusive;///<summary>///根据读写情况请求锁///</summary>///<paramname="exclusive">True为写请求,False为读请求</param>publicvoidEnter(boolexclusive){if(exclusive){while(WaitToWrite(refm_LockState))m_WritersLock.WaitOne();}else{while(WaitToRead(refm_LockState))m_ReadersLock.WaitOne();}m_exclusive=exclusive;}privatestaticboolWaitToWrite(refinttarget){intstart,current=target;boolwait;do{start=current;intdesired=start;wait=false;switch(State(desired)){caseOneManyLockStates.Free://IfFree->OBW,returncaseOneManyLockStates.ReservedForWriter://IfRFW->OBW,returnSetState(refdesired,OneManyLockStates.OwnedByWriter);break;caseOneManyLockStates.OwnedByWriter://IfOBW->WW++,wait&looparoundAddWritersWaiting(refdesired,1);wait=true;break;caseOneManyLockStates.OwnedByReaders://IfOBRorOBRAWP->OBRAWP,WW++,wait,looparoundcaseOneManyLockStates.OwnedByReadersAndWriterPending:SetState(refdesired,OneManyLockStates.OwnedByReadersAndWriterPending);AddWritersWaiting(refdesired,1);wait=true;break;default:Debug.Assert(false,"Invalid Lock state");break;}current=Interlocked.CompareExchange(reftarget,desired,start);}while(start!=current);returnwait;}///<summary>///释放锁,将根据锁状态自动区分读写锁///</summary>publicvoidLeave(){intwakeup;if(m_exclusive){Debug.Assert((State(m_LockState)==OneManyLockStates.OwnedByWriter)&&(NumReadersReading(m_LockState)==0));//Pre-condition:Lock'sstatemustbeOBW(notFree/OBR/OBRAWP/RFW)//Post-condition:Lock'sstatemustbecomeFreeorRFW(thelockisneverpassed)//Phase1:Releasethelockwakeup=DoneWriting(refm_LockState);}else{vars=State(m_LockState);Debug.Assert((State(m_LockState)==OneManyLockStates.OwnedByReaders)||(State(m_LockState)==OneManyLockStates.OwnedByReadersAndWriterPending));//Pre-condition:Lock'sstatemustbeOBR/OBRAWP(notFree/OBW/RFW)//Post-condition:Lock'sstatemustbecomeunchanged,FreeorRFW(thelockisneverpassed)//Phase1:Releasethelockwakeup=DoneReading(refm_LockState);}//Phase2:Possiblywakewaitersif(wakeup==-1)m_WritersLock.Release();elseif(wakeup>0)m_ReadersLock.Release(wakeup);}//Returns-1towakeawriter,+#towake#readers,or0towakenooneprivatestaticintDoneWriting(refinttarget){intstart,current=target;intwakeup=0;do{intdesired=(start=current);//Wedothistestfirstbecauseitiscommonlytrue&//weavoidtheothertestsimprovingperformanceif(!AnyWaiters(desired)){SetState(refdesired,OneManyLockStates.Free);wakeup=0;}elseif(NumWritersWaiting(desired)>0){SetState(refdesired,OneManyLockStates.ReservedForWriter);AddWritersWaiting(refdesired,-1);wakeup=-1;}else{wakeup=NumReadersWaiting(desired);Debug.Assert(wakeup>0);SetState(refdesired,OneManyLockStates.OwnedByReaders);AddReadersWaiting(refdesired,-wakeup);//RW=0,RR=0(incrementedasreadersenter)}current=Interlocked.CompareExchange(reftarget,desired,start);}while(start!=current);returnwakeup;}#endregion#regionReadermembersprivatestaticboolWaitToRead(refinttarget){intstart,current=target;boolwait;do{intdesired=(start=current);wait=false;switch(State(desired)){caseOneManyLockStates.Free://IfFree->OBR,RR=1,returnSetState(refdesired,OneManyLockStates.OwnedByReaders);AddReadersReading(refdesired,1);break;caseOneManyLockStates.OwnedByReaders://IfOBR->RR++,returnAddReadersReading(refdesired,1);break;caseOneManyLockStates.OwnedByWriter://IfOBW/OBRAWP/RFW->RW++,wait,looparoundcaseOneManyLockStates.OwnedByReadersAndWriterPending:caseOneManyLockStates.ReservedForWriter:AddReadersWaiting(refdesired,1);wait=true;break;default:Debug.Assert(false,"Invalid Lock state");break;}current=Interlocked.CompareExchange(reftarget,desired,start);}while(start!=current);returnwait;}//Returns-1towakeawriter,+#towake#readers,or0towakenooneprivatestaticintDoneReading(refinttarget){intstart,current=target;intwakeup;do{intdesired=(start=current);AddReadersReading(refdesired,-1);//RR--if(NumReadersReading(desired)>0){//RR>0,nostatechange¬hreadstowakewakeup=0;}elseif(!AnyWaiters(desired)){SetState(refdesired,OneManyLockStates.Free);wakeup=0;}else{Debug.Assert(NumWritersWaiting(desired)>0);SetState(refdesired,OneManyLockStates.ReservedForWriter);AddWritersWaiting(refdesired,-1);wakeup=-1;//Wake1writer}current=Interlocked.CompareExchange(reftarget,desired,start);}while(start!=current);returnwakeup;}#endregion}#endregion#region简单的混合锁///<summary>///一个简单的混合线程同步锁,采用了基元用户加基元内核同步构造实现///</summary>///<example>///以下演示常用的锁的使用方式,还包含了如何优雅的处理异常锁///<codelang="cs"source="HslCommunication_Net45.Test\Documentation\Samples\Core\ThreadLock.cs"region="SimpleHybirdLockExample1"title="SimpleHybirdLock示例"/>///</example>publicsealedclassSimpleHybirdLock:IDisposable{#regionIDisposableSupportprivatebooldisposedValue=false;//要检测冗余调用voidDispose(booldisposing){if(!disposedValue){if(disposing){//TODO:释放托管状态(托管对象)。}//TODO:释放未托管的资源(未托管的对象)并在以下内容中替代终结器。//TODO:将大型字段设置为null。m_waiterLock.Close();disposedValue=true;}}//TODO:仅当以上Dispose(booldisposing)拥有用于释放未托管资源的代码时才替代终结器。//~SimpleHybirdLock(){////请勿更改此代码。将清理代码放入以上Dispose(booldisposing)中。//Dispose(false);//}//添加此代码以正确实现可处置模式。///<summary>///释放资源///</summary>publicvoidDispose(){//请勿更改此代码。将清理代码放入以上Dispose(booldisposing)中。Dispose(true);//TODO:如果在以上内容中替代了终结器,则取消注释以下行。//GC.SuppressFinalize(this);}#endregion///<summary>///基元用户模式构造同步锁///</summary>privateintm_waiters=0;///<summary>///基元内核模式构造同步锁///</summary>privateAutoResetEventm_waiterLock=newAutoResetEvent(false);///<summary>///获取锁///</summary>publicvoidEnter(){if(Interlocked.Increment(refm_waiters)==1)return;//用户锁可以使用的时候,直接返回,第一次调用时发生//当发生锁竞争时,使用内核同步构造锁m_waiterLock.WaitOne();}///<summary>///离开锁///</summary>publicvoidLeave(){if(Interlocked.Decrement(refm_waiters)==0)return;//没有可用的锁的时候m_waiterLock.Set();}///<summary>///获取当前锁是否在等待当中///</summary>publicboolIsWaitting=>m_waiters!=0;}#endregion#region多线程并发处理数据的类/*********************************************************************************创建日期:2017年7月6日08:30:56*********************************************************************************////<summary>///一个用于多线程并发处理数据的模型类,适用于处理数据量非常庞大的情况///</summary>///<typeparamname="T">等待处理的数据类型</typeparam>publicsealedclassSoftMultiTask<T>{///<summary>///实例化一个数据处理对象///</summary>///<paramname="dataList">数据处理列表</param>///<paramname="operater">数据操作方法,应该是相对耗时的任务</param>///<paramname="threadCount">需要使用的线程数</param>publicSoftMultiTask(T[]dataList,Func<T,bool>operater,intthreadCount=10){m_dataList=dataList??thrownewArgumentNullException("dataList");m_operater=operater??thrownewArgumentNullException("operater");if(threadCount<1)thrownewArgumentException("threadCount can not less than 1","threadCount");m_threadCount=threadCount;//增加任务处理Interlocked.Add(refm_opCount,dataList.Length);//增加线程处理Interlocked.Add(refm_opThreadCount,threadCount);}///<summary>///操作总数,判定操作是否完成///</summary>privateintm_opCount=0;///<summary>///判断是否所有的线程是否处理完成///</summary>privateintm_opThreadCount=1;///<summary>///准备启动的处理数据的线程数量///</summary>privateintm_threadCount=10;///<summary>///指示多线程处理是否在运行中,防止冗余调用///</summary>privateintm_runStatus=0;///<summary>///列表数据///</summary>privateT[]m_dataList=null;///<summary>///需要操作的方法///</summary>privateFunc<T,bool>m_operater=null;///<summary>///一个双参数委托///</summary>///<paramname="item"></param>///<paramname="ex"></param>publicdelegatevoidMultiInfo(Titem,Exceptionex);///<summary>///用于报告进度的委托,当finish等于count时,任务完成///</summary>///<paramname="finish">已完成操作数量</param>///<paramname="count">总数量</param>///<paramname="success">成功数量</param>///<paramname="failed">失败数量</param>publicdelegatevoidMultiInfoTwo(intfinish,intcount,intsuccess,intfailed);///<summary>///异常发生时事件///</summary>publiceventMultiInfoOnExceptionOccur;///<summary>///报告处理进度时发生///</summary>publiceventMultiInfoTwoOnReportProgress;///<summary>///已处理完成数量,无论是否异常///</summary>privateintm_finishCount=0;///<summary>///处理完成并实现操作数量///</summary>privateintm_successCount=0;///<summary>///处理过程中异常数量///</summary>privateintm_failedCount=0;///<summary>///用于触发事件的混合线程锁///</summary>privateSimpleHybirdLockHybirdLock=newSimpleHybirdLock();///<summary>///指示处理状态是否为暂停状态///</summary>privateboolm_isRunningStop=false;///<summary>///指示系统是否需要强制退出///</summary>privateboolm_isQuit=false;///<summary>///在发生错误的时候是否强制退出后续的操作///</summary>privateboolm_isQuitAfterException=false;#regionStartStopMethod///<summary>///启动多线程进行数据处理///</summary>publicvoidStartOperater(){if(Interlocked.CompareExchange(refm_runStatus,0,1)==0){for(inti=0;i<m_threadCount;i++){Threadthread=newThread(newThreadStart(ThreadBackground));thread.IsBackground=true;thread.Start();}JustEnded();}}///<summary>///暂停当前的操作///</summary>publicvoidStopOperater(){if(m_runStatus==1){m_isRunningStop=true;}}///<summary>///恢复暂停的操作///</summary>publicvoidResumeOperater(){m_isRunningStop=false;}///<summary>///直接手动强制结束操作///</summary>publicvoidEndedOperater(){if(m_runStatus==1){m_isQuit=true;}}///<summary>///在发生错误的时候是否强制退出后续的操作///</summary>publicboolIsQuitAfterException{get{returnm_isQuitAfterException;}set{m_isQuitAfterException=value;}}#endregionprivatevoidThreadBackground(){while(true){//检测是否处于暂停的状态while(m_isRunningStop){;}//提取处理的任务intindex=Interlocked.Decrement(refm_opCount);if(index<0){//任务完成break;}else{Titem=m_dataList[index];boolresult=false;boolisException=false;try{if(!m_isQuit)result=m_operater(item);}catch(Exceptionex){isException=true;//此处必须吞噬所有异常OnExceptionOccur?.Invoke(item,ex);//是否需要退出处理if(m_isQuitAfterException)EndedOperater();}finally{//保证了报告进度时数据的正确性HybirdLock.Enter();if(result)m_successCount++;if(isException)m_failedCount++;m_finishCount++;OnReportProgress?.Invoke(m_finishCount,m_dataList.Length,m_successCount,m_failedCount);HybirdLock.Leave();}}}JustEnded();}privatevoidJustEnded(){if(Interlocked.Decrement(refm_opThreadCount)==0){//数据初始化m_finishCount=0;m_failedCount=0;m_successCount=0;Interlocked.Exchange(refm_opCount,m_dataList.Length);Interlocked.Exchange(refm_opThreadCount,m_threadCount+1);//状态复位Interlocked.Exchange(refm_runStatus,0);m_isRunningStop=false;m_isQuit=false;}}}#endregion#region双检锁#if!NET35///<summary>///一个双检锁的示例,适合一些占内存的静态数据对象,获取的时候才实例化真正的对象///</summary>internalsealedclassSingleton{privatestaticobjectm_lock=newobject();privatestaticSingletonSValue=null;publicSingleton(){}publicstaticSingletonGetSingleton(){if(SValue!=null)returnSValue;Monitor.Enter(m_lock);if(SValue==null){Singletontemp=newSingleton();Volatile.Write(refSValue,temp);//上述编译不通过,简单的使用下述过程SValue=newSingleton();}Monitor.Exit(m_lock);returnSValue;}}#endif#endregion#region高级混合锁#if!NET35///<summary>///一个高级的混合线程同步锁,采用了基元用户加基元内核同步构造实现,并包含了自旋和线程所有权///</summary>internalsealedclassAdvancedHybirdLock:IDisposable{#regionIDisposableSupportprivatebooldisposedValue=false;//要检测冗余调用voidDispose(booldisposing){if(!disposedValue){if(disposing){//TODO:释放托管状态(托管对象)。}//TODO:释放未托管的资源(未托管的对象)并在以下内容中替代终结器。//TODO:将大型字段设置为null。m_waiterLock.Close();disposedValue=true;}}//TODO:仅当以上Dispose(booldisposing)拥有用于释放未托管资源的代码时才替代终结器。//~SimpleHybirdLock(){////请勿更改此代码。将清理代码放入以上Dispose(booldisposing)中。//Dispose(false);//}//添加此代码以正确实现可处置模式。///<summary>///释放资源///</summary>publicvoidDispose(){//请勿更改此代码。将清理代码放入以上Dispose(booldisposing)中。Dispose(true);//TODO:如果在以上内容中替代了终结器,则取消注释以下行。//GC.SuppressFinalize(this);}#endregion///<summary>///基元用户模式构造同步锁///</summary>privateintm_waiters=0;///<summary>///基元内核模式构造同步锁///</summary>privateAutoResetEventm_waiterLock=newAutoResetEvent(false);///<summary>///控制自旋的一个字段///</summary>privateintm_spincount=4000;///<summary>///指出哪个线程拥有锁///</summary>privateintm_owningThreadId=0;///<summary>///指示锁拥有了多少次///</summary>privateintm_recursion=0;///<summary>///获取锁///</summary>publicvoidEnter(){intthreadId=Thread.CurrentThread.ManagedThreadId;if(threadId==m_owningThreadId){m_recursion++;return;//如果调用线程已经拥有锁,就返回}//SpinWaitspinwaitif(Interlocked.Increment(refm_waiters)==1)return;//用户锁可以使用的时候,直接返回,第一次调用时发生//当发生锁竞争时,使用内核同步构造锁m_waiterLock.WaitOne();}///<summary>///离开锁///</summary>publicvoidLeave(){if(Interlocked.Decrement(refm_waiters)==0)return;//没有可用的锁的时候m_waiterLock.Set();}}#endif#endregion}