1.Critical_section
相關操作:
InitializeCriticalSection
EnterCriticalSection
LeaveCriticalSection
DeleteCriticalSection
TryEnterCriticalSection //如果資源被佔用會返回false,而不是進行睡眠等待。
InitializeCriticalSectionAndSpinCount(a, b)//b在單一處理器中將會被忽略
SetCriticalSectionSpinCount(a, b) //
struct RTL_CRITICAL_SECTION
{
PRTL_CRITICAL_SECTION_DEBUG DebugInfo;
LONG LockCount;
LONG RecursionCount;
HANDLE OwningThread;
HANDLE LockSemaphore;
ULONG_PTR SpinCount;
};
struct RTL_CRITICAL_SECTION
{
PRTL_CRITICAL_SECTION_DEBUG DebugInfo;
LONG LockCount;
LONG RecursionCount;
HANDLE OwningThread;
HANDLE LockSemaphore;
ULONG_PTR SpinCount;
};
DebugInfo 此欄位包含一個指標,指向系統分配的伴隨結構,該結構的類型為
RTL_CRITICAL_SECTION_DEBUG
LockCount 這是臨界區中最重要的一個欄位。它被初始化為數值 -1,這裡LockCount為1意思為除了一個線程擁有它外,另外還有一個線程在等待它,它是由EnterCriticalSection增加,LeaveCriticalSection來減小的。((“此數值等於或大於 0 時,表示此臨界區被佔用。當其不等於 -1 時,OwningThread 欄位包含了擁有此臨界區的線程 ID。此欄位與 (RecursionCount -1) 數值之間的差值表示有多少個其他線程在等待獲得該臨界區”))是網上的資料,本人測試好像並不是這樣,如果有知道兩者之間的關係的,留言告知一下。
RecursionCount 此欄位為本線程遞迴獲得該臨界區的次數。初始為0,如果該數值為零,下一個嘗試擷取該臨界區的線程將會成功。
OwningThread 此欄位包含當前佔用此臨界區的線程的線程標識符。此線程 ID 與 GetCurrentThreadId 之類的 API 所返回的 ID 相同,為0時臨界區為有訊號狀態。
LockSemaphore 它實際上是一個自複位事件,而不是一個訊號。它是一個核心物件控點,用於通知作業系統:該臨界區現在空閑。作業系統在一個線程第一次嘗試獲得該臨界區,但被另一個已經擁有該臨界區的線程所阻止時,自動建立這樣一個控制代碼。應當調用 DeleteCriticalSection(它將發出一個調用該事件的 CloseHandle 調用,並在必要時釋放該調試結構),否則將會發生資源泄漏。
SpinCount 僅用於多處理器系統。在多處理器系統中,如果該臨界區不可用,調用線程將在對與該臨界區相關的訊號執行等待操作之前,旋轉 dwSpinCount 次。如果該臨界區在旋轉操作期間變為可用,該調用線程就避免了等待操作。旋轉計數可以在多處理器電腦上提供更佳效能,其原因在於在一個迴圈中旋轉通常要快於進入核心模式等待狀態。此欄位預設值為零,但可以用InitializeCriticalSectionAndSpinCount API 將其設定為一個不同值。