1. 程式人生 > >【Dokan學習記錄】2015-01-28

【Dokan學習記錄】2015-01-28

dokan.h

CRITICAL_SECTIONCriticalSection;

臨界區:就是訪問臨界資源的那段程式碼.

是一個訪問共用資源的程式片段,而這些共用資源有無法同時被多個執行緒訪問的特性。當有執行緒進入臨界區段時,其他執行緒或是程序必須等待.

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個執行緒的房間,如果總數不滿就可以進去,如果滿了,就要等待有人出來。用於限制對於某一資源的同時訪問。