線程同步之——互斥量及死鎖問題

互斥量:
多個線程同時訪問共享數據時可能會衝突,這跟信號的可重性是一樣的問題。如 果兩個線程都要把某個全局變量增長1,這個操做在某平臺須要三條指令完成:算法

1. 從內存讀變量值到寄存器安全

2. 寄存器的值加1多線程

3. 將寄存器的值寫回內存ide

先舉個例子:建立兩個線程,各把counter增長5000次,正常狀況下最後counter應該等於10000。函數

代碼實現以下:性能

wKioL1caIMaBwlAQAABo8TwjRVA310.png

結果:spa

wKioL1caIO6hywnNAAAt3P-fjqk954.png

wKiom1caICvDqzhIAAAasAY1ZCY031.png

wKiom1caICzzyYlgAAAbzBPKzjA623.png

能夠看到,每次運行程序的結果都不同。說明在調用過程當中發生了互斥現象。
操作系統

解決辦法:加互斥鎖
線程

實現多線程同步能夠引互斥鎖(Mutex,Mutual Exclusive Lock),得到鎖的線程能夠完成「讀-修改-寫」的操做,而後釋放鎖給其它線程,沒有得到鎖的線程只能等待不能訪問共享數據,這樣「讀-修改-寫」三步操做組成個原操做,要麼都執,要麼都不執,不會執到中間被打斷,也不會在其它處理器上並作這個操做。 Mutexpthread_mutex_t類型的變量表,能夠這樣初始化和銷燬。orm

相關函數以下:

wKiom1caIRvBFQlCAABGuZXaxYo919.png

pthread_mutex_init函 數初始化的Mutex能夠pthread_mutex_destroy銷燬。 若是Mutex變量是靜態分配的(全局變量 或static變量),也能夠宏定義PTHREAD_MUTEX_INITIALIZER來初始化,至關於 pthread_mutex_init初始化而且attr參數爲NULL。 Mutex的加鎖和解鎖操做能夠下列函數


wKiom1caIRvAUjDXAAA8XcuC8t8961.png

一個線程能夠調pthread_mutex_lock得到Mutex,若是這時另一個線程已經調pthread_mutex_lock得到了該Mutex,則當前線程須要掛起等待,直到另一個線程調pthread_mutex_unlock釋放Mutex,當前線程被喚醒,才能得到該Mutex並繼續執。若是這個線程既想得到鎖,又不想掛起等待,能夠調pthread_mutex_trylock,若是Mutex已經被 另一個線程得到,這個函數會失敗返回EBUSY,不會使線程掛起等待。

如今給上一個例子加上互斥鎖,代碼以下:

wKiom1caI8OBf3fdAABisdQTI4w036.png

運行結果以下:

wKiom1caI-OTIqfxAAAfCAVV9No722.png

能夠看到,加鎖後實現了線程同步。


死鎖原理:

根據操做系統中的定義:死鎖是指在一組進程中的各個進程均佔有不會釋放的資源,但因互相申請被其餘進程所佔用不會釋放的資源而處於的一種永久等待狀態。

死鎖的四個必要條件:
一、互斥條件(Mutual exclusion):資源不能被共享,只能由一個進程使用。
二、請求與保持條件(Hold and wait):已經獲得資源的進程能夠再次申請新的資源。
三、非剝奪條件(No pre-emption):已經分配的資源不能從相應的進程中被強制地剝奪。
四、循環等待條件(Circular wait):系統中若干進程組成環路,該環路中每一個進程都在等待相鄰進程正佔用的資源

解決死鎖的基本方法:

1、預防死鎖:

資源一次性分配:(破壞請求和保持條件)

可剝奪資源:即當某進程新的資源未知足時,釋放已佔有的資源(破壞不可剝奪條件)。

資源有序分配法:系統給每類資源賦予一個編號,每個進程按編號遞增的順序請求資源,釋放則相反(破壞環路等待條件)。 

2、避免死鎖:

預防死鎖的幾種策略,會嚴重地損害系統性能。所以在避免死鎖時,要施加較弱的限制,從而得到較滿意的系統性能。因爲在避免死鎖的策略中,容許進程動態地申請資源。於是,系統在進行資源分配以前預先計算資源分配的安全性。若這次分配不會致使系統進入不安全狀態,則將資源分配給進程;不然,進程等待。其中最具備表明性的避免死鎖算法是銀行家算法。 

3、檢測死鎖

首先爲每一個進程和每一個資源指定一個惟一的號碼;

而後創建資源分配表和進程等待表。

4、解除死鎖:

當發現有進程死鎖後,便應當即把它從死鎖狀態中解脫出來,常採用的方法有:

剝奪資源:從其它進程剝奪足夠數量的資源給死鎖進程,以解除死鎖狀態;

撤消進程:能夠直接撤消死鎖進程或撤消代價最小的進程,直至有足夠的資源可用,死鎖狀態.消除爲止;所謂代價是指優先級、運行代價、進程的重要性和價值等。

相關文章
相關標籤/搜索