1. 程式人生 > >秒殺多執行緒第九篇 經典執行緒同步總結 關鍵段 事件 互斥量 訊號量

秒殺多執行緒第九篇 經典執行緒同步總結 關鍵段 事件 互斥量 訊號量

               

前面《秒殺多執行緒第四篇一個經典的多執行緒同步問題》提出了一個經典的多執行緒同步互斥問題,這個問題包括了主執行緒與子執行緒的同步,子執行緒間的互斥,是一道非常經典的多執行緒同步互斥問題範例,後面分別用了四篇

來詳細介紹常用的執行緒同步互斥機制——關鍵段、事件、互斥量、訊號量。下面對它們作個總結,幫助大家梳理各個知識點。

首先來看下關於執行緒同步互斥的概念性的知識,相信大家通過前面的文章,已經對執行緒同步互斥有一定的認識了,也能模糊的說出執行緒同步互斥的各種概念性知識,下面再列出從《計算機作業系統》一書中選取的一些關於執行緒同步互斥的描述。相信先有個初步而模糊的印象再看下權威的定義,應該會記憶的特別深刻。

1.執行緒(程序)同步的主要任務

答:在引入多執行緒後,由於執行緒執行的非同步性,會給系統造成混亂,特別是在急用臨界資源時,如多個執行緒急用同一臺印表機,會使列印結果交織在一起,難於區分。當多個執行緒急用共享變數,表格,連結串列時,可能會導致資料處理出錯,因此執行緒同步的主要任務是使併發執行的各執行緒之間能夠有效的共享資源和相互合作,從而使程式的執行具有可再現性。

2.執行緒(程序)之間的制約關係?

當執行緒併發執行時,由於資源共享和執行緒協作,使用執行緒之間會存在以下兩種制約關係。

1).間接相互制約。一個系統中的多個執行緒必然要共享某種系統資源,如共享CPU,共享I/O裝置,所謂間接相互制約即源於這種資源共享,印表機就是最好的例子,執行緒A

在使用印表機時,其它執行緒都要等待。

2).直接相互制約。這種制約主要是因為執行緒之間的合作,如有執行緒A將計算結果提供給執行緒B作進一步處理,那麼執行緒B線上程A將資料送達之前都將處於阻塞狀態。

間接相互制約可以稱為互斥,直接相互制約可以稱為同步,對於互斥可以這樣理解,執行緒A和執行緒B互斥訪問某個資源則它們之間就會產個順序問題——要麼執行緒A等待執行緒B操作完畢,要麼執行緒B等待執行緒操作完畢,這其實就是執行緒的同步了。因此同步包括互斥,互斥其實是一種特殊的同步

3.臨界資源和臨界區

在一段時間內只允許一個執行緒訪問的資源就稱為臨界資源或獨佔資源,計算機中大多數物理裝置,程序中的共享變數等待都是臨界資源,它們要求被互斥的訪問。每個程序中訪問臨界資源的程式碼稱為臨界區

看完概念性知識,下面用幾個表格來幫助大家更好的記憶運用多執行緒同步互斥的四個實現方法——關鍵段、事件、互斥量、訊號量

關鍵段CS與互斥量Mutex

建立或初始化

銷燬

進入互斥區域

離開互斥區域

關鍵段CS

Initialize-

CriticalSection

Delete-

CriticalSection

Enter-

CriticalSection

Leave-

CriticalSection

互斥量Mutex

CreateMutex

CloseHandle

等待系列函式如WaitForSingleObject

ReleaseMutex

關鍵段與互斥量都有“執行緒所有權”概念,可以將“執行緒所有權”理解成旅館的房卡,在旅館前臺登記名字擁有房卡後是可以多次進出房間的,其它人則無法進入直到你交出房卡。每個執行緒必須先通過EnterCriticalSectionWaitForSingleObject來嘗試獲得“執行緒所有權”才能呼叫LeaveCriticalSectionReleaseMutex。否則會呼叫失敗,這就相當於偽造房卡去辦理退房手續——由於登記本上沒有你的名字所以會被拒絕。

互斥量能很好的處理“遺棄”情況,因此在多程序之間可以放心的使用。

事件Event

建立

銷燬

使事件觸發

使事件未觸發

事件Event

CreateEvent

CloseHandle

SetEvent

ResetEvent

注意事件的手動置位和自動置位要分清楚,不要混淆了

訊號量Semaphore

建立

銷燬

遞減計數

遞增計數

訊號量

Semaphore

Create-

Semaphore

CloseHandle

等待系列函式如WaitForSingleObject

Release-

Semaphore

訊號量在計數大於0時表示觸發狀態,呼叫WaitForSingleObject不會阻塞,等於0表示未觸發狀態,呼叫WaitForSingleObject會阻塞直到有其它執行緒遞增了計數。

注意:互斥量,事件,訊號量都是核心物件,可以跨程序使用(通過OpenMutexOpenEventOpenSemaphore)。不過為什麼只有互斥量能解決

呵呵^_^,本系列一共使用了六篇文章來講解了上面三個表格,如果讀者能輕鬆寫出這個表格並能解釋下各函式的用法,那麼對多執行緒的同步互斥問題也就有了良好的基礎。

通過經典執行緒同步問題的學習,我們已經初步練好了解決多執行緒同步互斥的各種“招式”,下面再通過學習二個著名的例項《秒殺多執行緒第十篇 生產者消費者問題》和《秒殺多執行緒第十一篇 讀者寫者問題》來使我們在解決多執行緒同步時更加熟練。