C#多线程编程中的锁系统(三)
本章主要说下基于内核模式构造的线程同步方式,事件,信号量。
目录
一:理论
二:WaitHandle
三:AutoResetEvent
四:ManualResetEvent
五:总结
一:理论
我们晓得线程同步可分为,用户模式构造和内核模式构造。
内核模式构造:是由windows系统本身使用,内核对象进行调度协助的。内核对象是系统地址空间中的一个内存块,由系统创建维护。
内核对象为内核所拥有,而不为进程所拥有,所以不同进程可以访问同一个内核对象,如进程,线程,作业,事件,文件,信号量,互斥量等都是内核对象。
而信号量,互斥体,事件是windows专门用来帮助我们进行线程同步的内核对象。
对于线程同步操作来说,内核对象只有2个状态,触发(终止,true)、未触发(非终止,false)。未触发不可调度,触发可调度。
用户模式构造:是由特殊CPU指令来协调线程,上节讲的volatile实现就是一种,Interlocked也是。 也可称为非阻塞线程同步。
二:WaitHandle
在windows编程中,我们通过API创建一个内核对象后会返回一个句柄,句柄则是每个进程句柄表的索引,而后可以拿到内核对象的指针、掩码、标示等。
而WaitHandle抽象基类类作用是包装了一个windows内核对象的句柄。我们来看下其中一个WaitOne的函数源码(略精简)。
publicvirtualboolWaitOne(TimeSpantimeout) { returnWaitOne(timeout,false); }
[System.Security.SecuritySafeCritical] //auto-generated [SuppressMessage("Microsoft.Concurrency","CA8001",Justification="Reviewedforthread-safety.")] privateboolWaitOne(longtimeout,boolexitContext) { returnInternalWaitOne(safeWaitHandle,timeout,hasThreadAffinity,exitContext); } [System.Security.SecurityCritical] internalstaticboolInternalWaitOne(SafeHandlewaitableSafeHandle,longmillisecondsTimeout,boolhasThreadAffinity,boolexitContext) { Contract.EndContractBlock(); intret=WaitOneNative(waitableSafeHandle,(uint)millisecondsTimeout,hasThreadAffinity,exitContext); if(ret==WAIT_ABANDONED) { ThrowAbandonedMutexException(); } return(ret!=WaitTimeout); } //调用win32waitforsingleobjectEx [System.Security.SecurityCritical] [ResourceExposure(ResourceScope.None)] [MethodImplAttribute(MethodImplOptions.InternalCall)] privatestaticexternintWaitOneNative(SafeHandlewaitableSafeHandle,uintmillisecondsTimeout,boolhasThreadAffinity,boolexitContext);