臨界區與互斥鎖的區別

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


臨界區

1.1臨界區原理:

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

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

1.2臨界區的實現:

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

互斥量

2.1互斥量原理:

互斥量可以看作是信號量的簡化版。是一個內核對象,具有線程擁有權,可以實現進程的同步,線程的互斥訪問,但不能實現線程的同步。

2.2互斥量實現:

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

臨界區與互斥量對比

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


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章