dokan.h
CRITICAL_SECTION CriticalSection;
临界区:就是访问临界资源的那段代码.
是一个访问共用资源的程序片段,而这些共用资源有无法同时被多个线程访问的特性。当有线程进入临界区段时,其他线程或是进程必须等待.
typedefstruct_RTL_CRITICAL_SECTION{
PRTL_CRITICAL_SECTION_DEBUGDebugInfo;
LONGLockCount;
LONGRecursionCount;
HANDLEOwningThread; // from the thread'sClientId->UniqueThread
HANDLELockSemaphore;
ULONG_PTRSpinCount; // force size on 64-bit systems whenpacked
}RTL_CRITICAL_SECTION,*PRTL_CRITICAL_SECTION;
LockCount 临界区中最重要的一个字段.它被初始化为数值 -1;此数值等于或大于 0时,表示此临界区被占用。当其不等于-1时,OwningThread字段包含了拥有此临界区的线程ID.此字段与 (RecursionCount -1) 数值之间的差值表示有多少个其他线程在等待获得该临界区.(有人说, OwningThread应该是DWORD类型而不是.)
RecursionCount此字段包含所有者线程已经获得该临界区的次数.(如果该数值为零,下一个尝试获取该临界区的线程将会成功.)
OwningThread 此字段包含当前占用此临界区的线程的线程标识符.(与GetCurrentThreadId 所返回的 ID 相同.)
LockSemaphore 一个内核对象句柄,用于通知操作系统:该临界区现在空闲.
win32的API中,对于临界区的操作:
VOIDInitializeCriticalSection(LPCRITICAL_SECTION lpCriticalSection);//初始化一个临界资源对象, lpCriticalSection 临界资源对象指针.
WINBASEAPIVOIDWINAPIEnterCriticalSection(__inoutLPCRITICAL_SECTION lpCriticalSection);//进入临界区,__inout双向口
WINBASEAPIVOIDWINAPI LeaveCriticalSection();(__inoutLPCRITICAL_SECTION lpCriticalSection);//标记临界区结束
WINBASEAPIVOIDWINAPILeaveCriticalSection();(__inoutLPCRITICAL_SECTION lpCriticalSection);//标记临界区结束
PS: mutex(互斥量)与semaphore(信号量)
Mutex是一把凭证货是钥匙,一个线程拿了就可进入,出来的时候把钥匙交给下一个人。一般的用法是用于串行化对critical section代码的访问,保证这段代码不会被并行的运行。
Semaphore是可以容纳n个线程的房间,如果总数不满就可以进去,如果满了,就要等待有人出来。用于限制对于某一资源的同时访问。