1. 程式人生 > >臨界區與互斥鎖的區別

臨界區與互斥鎖的區別

一直沒弄清楚這兩個東東的區別,希望能好好總結下。上次面試也問到了這方面的相關問題,回答得不是很好。

臨界區

1.1臨界區原理:

首先明白臨界區是指一段程式碼,這段程式碼是用來訪問臨界資源的。臨界資源可以是硬體資源,也可以是軟體資源。但它們有一個特點就是,一次僅允許一個程序或執行緒訪問。當有多個執行緒試圖同時訪問,但已經有一個執行緒在訪問該臨界區了,那麼其他執行緒將被掛起。臨界區被釋放後,其他執行緒可繼續搶佔該臨界區。

臨界區是一種輕量級的同步機制,與互斥和事件這些核心同步物件相比,臨界區是使用者態下的物件,即只能在同一程序中實現執行緒互斥。因無需在使用者態和核心態之間切換,所以工作效率比較互斥來說要高很多。

1.2臨界區的實現:

臨界區的使用方法非常簡單,使用 InitializeCriticalSection 或 InitializeCriticalSectionAndSpinCount 函式初始化一個 CRITICAL_SECTION 結構;使用 SetCriticalSectionSpinCount 函式設定臨界區的Spin計數器;然後使用 EnterCriticalSection 或 TryEnterCriticalSection 獲取臨界區的所有權;完成需要同步的操作後,使用 LeaveCriticalSection 函式釋放臨界區;最後使用 DeleteCriticalSection 函式析構臨界區結構。

互斥量

2.1互斥量原理:

互斥量可以看作是訊號量的簡化版。是一個核心物件,具有執行緒擁有權,可以實現程序的同步,執行緒的互斥訪問,但不能實現執行緒的同步。

2.2互斥量實現:

用法也很簡單,主要是要弄清楚在什麼時候使用互斥量比較好。相關的函式有CreateMutex、OpenMutex和ReleaseMutex,因為是核心物件,所有可以使用CloseHandle來清理互斥變數。

臨界區與互斥量對比

直接在網上看到了這張截圖,copy過來了,區別已經說得比較詳細了。