1. 程式人生 > >程序執行緒同步相關

程序執行緒同步相關

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 將其設定為一個不同值。