【Dokan学习记录】2015-01-28

来源:互联网 发布:安卓卡iphone7在线软件 编辑:程序博客网 时间:2024/06/06 18:50

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个线程的房间,如果总数不满就可以进去,如果满了,就要等待有人出来。用于限制对于某一资源的同时访问。

0 0